第三方SDK定義了幾種類型定義,如:如何爲同一類型的typedefs提供模板特化?
typedef unsigned char SDK_BYTE
typedef double SDK_DOUBLE
typedef unsigned char SDK_BOOLEAN
它還定義了變量類型SdkVariant:
class SdkVariant
{
public:
enum SdkType { SdkByte, SdkDouble, SdkBoolean };
bool toByte(SDK_BYTE&);
bool toDouble(SDK_DOUBLE&);
bool toBool(SDK_BOOLEAN&);
SdkType type();
};
檢索從這種變型的值看起來像這樣(假定,我們知道所含值的類型):
SdkVariant variant(foobar());
double value;
bool res = variant.toDouble(value);
if (!res)
diePainfully();
else
doSomethingWith(value);
這是相當冗長,因此我想要提供一個variant_cast功能級是c一個執行值檢索和錯誤處理:
// general interface:
template<class T>
class variant_cast
{
public:
T operator()(const SdkVariant& variant);
};
// template specializations:
template<>
SDK_DOUBLE variant_cast<SDK_DOUBLE>::operator()(const SdkVariant& variant)
{
SDK_DOUBLE value;
bool res = variant.toDouble(value);
if (!res)
diePainfully();
return value;
}
template<>
SDK_BYTE variant_cast<SDK_BYTE>::operator()(const SdkVariant& variant)
{
SDK_BYTE value;
bool res = variant.toByte(value);
if (!res)
diePainfully();
return value;
}
template<>
SDK_BOOLEAN variant_cast<SDK_BOOLEAN>::operator()(const SdkVariant& variant)
{
SDK_BOOLEAN value;
bool res = variant.toByte(value);
if (!res)
diePainfully();
return value;
}
這並不編譯(C2995:已定義功能模板),因爲SDK_BYTE和SDK_BOOLEAN是相同的類型(無符號字符)。我的想法是讓預處理器檢查SDK_BYTE和SDK_BOOLEAN是否相同,如果是這樣,請爲兩者定義單個模板專用化。如果它們不同,它應該使用上面兩個獨立的專業化。像這樣:
#if SDK_BYTE == SDK_BOOLEAN
template<>
SDK_BYTE variant_cast<SDK_BYTE>::operator()(const SdkVariant& variant)
{
SDK_BYTE value;
bool res;
if (variant.type() == SdkByte)
res = variant.toByte(value);
else
res = variant.toBool(value);
if (!res)
diePainfully();
return value;
}
#else
// code from above
#endif
上述代碼的問題是,預處理器似乎無法解析兩個typedefs。有沒有辦法在預處理過程中比較兩個typedef(正確)?如果沒有,是否有辦法阻止編譯器解析類型定義,以便爲SDK_BYTE和SDK_BOOLEAN接受兩個不同的模板專門化?如果不是,我仍然可以提供單個模板專門化,並且如果SDK_BYTE和SDK_BOOLEAN不相等,則使用BOOST_STATIC_ASSERT使編譯器失敗,但有沒有更好的方法來解決我的問題?
不幸的是,預處理器不理解'typedefs'。 – 2012-08-16 06:53:19
['BOOST_STRONG_TYPEDEF'](http://www.boost.org/doc/libs/1_50_0/boost/strong_typedef.hpp) – Xeo 2012-08-16 07:16:31
您可以使用C++ 11和'std :: enable_if',並結合'std: :is_same'? – jogojapan 2012-08-16 07:34:08