我在這裏有一些代碼,它使用特殊值來檢查變量是否被初始化。默認值的函數模板
#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