我在这里有一些代码,它使用特殊值来检查变量是否被初始化。默认值的函数模板
#define NULLVALUE_FLOAT -9999
#define NULLVALUE_INT -9999
#define NULLVALUE_UINT 0
#define NULLVALUE_DOUBLE -9999
#define NULLVALUE_LONG -9999
#define NULLVALUE_LONGLONG -9999
#define NULLVALUE_CSTRING ""
bool isNull(float value) { return NULLVALUE_FLOAT == value; }
bool isNull(double value); ...
bool isNull(long value);...
bool isNull(int value);...
bool isNull(UINT value);...
bool isNull(CString value);...
因此,unsigned的特殊值是零,signed int和浮点数是-9999而string是空字符串。
现在我想重写一个模板函数,但由于CString版本有问题。我能做的最好的是两个函数,一个用于基本类型,一个用于CString。
template<typename T,
bool E = std::is_fundamental<T>::value && !std::is_unsigned<T>::value && (std::is_floating_point<T>::value || std::is_integral<T>::value),
bool E2 = std::is_fundamental<T>::value && std::is_unsigned<T>::value>
bool isNull(const T &t)
{
if (E)
return t == -9999;
else if (E2)
return t == 0;
else
return false;
}
bool isNull(const CString & s)
{
return s == "";
}
是否有可能使这个工作只有一个功能,即使添加其他类与默认值?
你有什么是已经很少。如果你尝试过,你可以用C++ 17中的'constexpr if'折叠成一个。 – StoryTeller
另外,如果你只是明确写入函数中的文字,为什么还要用丑陋的宏来打扰呢? – StoryTeller
@ Rakete1111 - 你连接的问题怎么样,这是一个愚蠢的?模板功能专业化几乎不是任何事情的答案。 – StoryTeller