运行时typeswitch的类型串作为开关,而不是一个嵌套if的?
-
23-09-2019 - |
题
这是从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);
}
}
};
它用于typeswitching上类型串。问题是 - 他们通过一系列嵌套if的的事情了。有没有办法做到这一点型交换机作为一个SELECT语句呢?
谢谢!
解决方案
您将需要预处理器生成一个大switch
。你需要get<>
到无操作的输出限制的查找。检查编译器输出,以确保未使用的情况下,没有产生输出,如果你关心;根据需要调整; v)的
查看升压预处理器库,如果你不在乎这样的事情,以获得良好的...
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.
}
};
其他提示
我不这么认为。
这种模板元编程的通常与递归方法来实现。由于这一切发生在编译时,我就不会,如果没有运行递归或条件检查惊讶。
您可以随时使用二进制搜索,而不是线性搜索。这将是更为复杂和更可能具有在它的错误(二进制搜索是非常容易弄乱)。
您也可以手动展开N个type_switch::operator()
,其中N是一些合理的,你会在你的节目类型串长度的数量上限。
不隶属于 StackOverflow