我想根据它所运行的类的枚举成员专门化模板函数成员的行为。我很确定这是可行的,但我无法理解。这是一个没有编译的失败尝试(为什么?)。事实上,我已经为我的项目提供了一个可行的解决方案(使用继承),但这并不好,我很好奇可以做些什么。
#include <iostream>
struct A
{
enum
{
Size = 2
};
};
struct B
{
enum
{
Size = 3
};
};
template <int I>
struct EnumToType
{
static const int e = I;
};
template <typename T, typename U>
struct C {};
template <typename T>
struct D
{
typedef C<T, typename EnumToType<T::Size> > Type;
};
template <typename T>
struct C<T, EnumToType<2> >
{
void operator()()
{
std::cout << "hi !" << std::endl;
}
};
template <typename T>
struct C<T, EnumToType<3> >
{
void operator()()
{
std::cout << "hello !" << std::endl;
}
};
int main()
{
D<A>::Type da;
D<B>::Type db;
da();
db();
return 0;
}
有用的link ...
答案 0 :(得分:2)
typedef C<T, typename EnumToType<T::Size> > Type;
这里的typename关键字毫无意义且非法,只需将其删除即可。
答案 1 :(得分:1)
一般模式如下所示(使用bool
而不是enum
类型,但原则保持不变):
template<typename FalseType, typename TrueType, bool condition>
struct ConditionalTypeSelector {
typedef void ResultType;
};
template<typename FalseType, typename TrueType>
struct ConditionalTypeSelector<FalseType,TrueType,false> {
typedef FalseType ResultType;
};
template<typename FalseType, typename TrueType>
struct ConditionalTypeSelector<FalseType,TrueType,true> {
typedef TrueType ResultType;
};
在其他地方使用
ConditionalTypeSelector<A,B,(sizeof(A) > sizeof(B))>::ResultType
答案 2 :(得分:1)
我不得不质疑你想要实现的目标,但这是解决你的榜样的一种方法:
struct A
{
static const int Size = 2;
};
struct B
{
static const int Size = 3;
};
template<int message_id>
struct Message;
template<>
struct Message<2>
{
void operator()()
{
std::cout << "hi !" << std::endl;
}
};
template<>
struct Message<3>
{
void operator()()
{
std::cout << "hello !" << std::endl;
}
};
template<typename T>
struct SizeStructToMessage
{
void operator()()
{
Message<T::Size> msg;
msg();
}
};
int main()
{
SizeStructToMessage<A> a;
SizeStructToMessage<B> b;
a();
b();
return 0;
}