我找不到问题的答案,所以我将其作为问题发布。我做了一个小的虚拟例子来解释它:
enum STORAGE_TYPE
{
CONTIGUOUS,
NON_CONTIGUOUS
};
template <typename T, STORAGE_TYPE type=CONTIGUOUS>
class Data
{
public:
void a() { return 1; }
};
// partial type specialization
template <typename T>
class Data<T, NON_CONTIGUOUS>
{
public:
void b() { return 0; }
};
// this method should accept any Data including specializations…
template <typename T, STORAGE_TYPE type>
void func(Data<T, type> &d)
{
/* How could I determine statically the STORAGE_TYPE? */
#if .. ??
d.a();
#else
d.b();
#endif
}
int main()
{
Data<int> d1;
Data<int, NON_CONTIGUOUS> d2;
func(d1);
func(d2);
return 0;
}
请注意 (1) 我不想要“func”的专门化,因为这可以解决它,但我只想拥有 1 个通用方法“func”,内部静态“if”条件来执行代码。 (2),我更喜欢使用标准 C++ 的解决方案(不是 C++0x 或 boost)。
最佳答案
使用traits technique :
template <typename T, STORAGE_TYPE type>
struct DataTraits {
static void callFunction(Data<T, type> &d)
{
d.a();
}
};
template <typename T>
struct DataTraits<T,NON_CONTIGUOUS> {
static void callFunction(Data<T, NON_CONTIGUOUS> &d)
{
d.b();
}
};
// this method should accept any Data including specializations…
template <typename T, STORAGE_TYPE type>
void func(Data<T, type> &d)
{
/* How could I determine statically the STORAGE_TYPE? */
DataTraits<T,type>::callFunction(d);
}
关于C++ 模板元编程静态类型检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12722493/