这是来自TTL:
////////////////////////////////////////////////////////////
// run-time type switch
template <typename L, int N = 0, bool Stop=(N==length<L>::value) > struct type_switch;
template <typename L, int N, bool Stop>
struct type_switch
{
template< typename F >
void operator()( size_t i, F& f )
{
if( i == N )
{
f.operator()<typename impl::get<L,N>::type>();
}
else
{
type_switch<L, N+1> next;
next(i, f);
}
}
};
它用于TypeList上的类型切换。问题是 - 他们通过一系列嵌套if来做到这一点。有没有办法将此类型切换作为单个select语句?
谢谢!
答案 0 :(得分:2)
您需要预处理器来生成大switch
。您需要get<>
来进行无操作的越界查找。检查编译器输出,确保未使用的情况不产生输出,如果你在意的话;必要时进行调整; v)。
如果您想要擅长此类事情,请查看Boost预处理器库...
template <typename L>
struct type_switch
{
template< typename F >
void operator()( size_t i, F& f )
{
switch ( i ) {
#define CASE_N( N ) \
case (N): return f.operator()<typename impl::get<L,N>::type>();
CASE_N(0)
CASE_N(1)
CASE_N(2)
CASE_N(3) // ad nauseam.
}
};
答案 1 :(得分:0)
我不这么认为。
这种模板元编程通常用递归完成。由于这一切都发生在编译时,如果没有运行时递归或条件检查,我不会感到惊讶。
答案 2 :(得分:0)
您始终可以使用二分搜索而不是线性搜索。它会更复杂,更容易出现错误(二进制搜索很容易搞砸)。
您也可以手动展开N type_switch::operator()
,其中N是您在程序中的类型列表长度数量的合理上限。