wol*_*e87 1 c++ conditional std c++11
我想做这样的事情:
void func(void *data, const int dtype)
{
typedef typename std::conditional<dtype==0,float,double>::type DataType;
funcT((DataType *)data);
return;
}
Run Code Online (Sandbox Code Playgroud)
这不会编译,因为dtype需要在编译时知道.我试图避免使用switch语句,因为我正在使用8个数据类型,有许多函数,如上面的那些,通过ctypes从Python调用.
有没有像std :: conditional这样的方法可以在运行时完成,利用传入的dtype标识符?
必须在编译时解析所有类型.因此,没有类型可以依赖于函数的运行时参数.处理这样的事情的方法基本上是建立一个访问机制,然后你可以重用它.基本上,这样的事情:
template <class F>
void visit_data(void* data, const int dtype, F f) {
switch (dtype)
case 0: f(*static_cast<float*>(data));
case 1: f(*static_cast<double*>(data));
}
Run Code Online (Sandbox Code Playgroud)
现在您可以通过编写访问者来实现功能:
struct func_impl {
void operator()(float&) { ... }
void operator()(double&) { ... }
};
Run Code Online (Sandbox Code Playgroud)
您的访问者还可以使用通用代码:
struct func_impl2 {
template <class T>
void operator()(T&) { ... }
};
Run Code Online (Sandbox Code Playgroud)
然后你可以通过利用访问者来编写你的功能:
void func(void* data, const int dtype) {
visit_data(data, dtype, func_impl{});
}
Run Code Online (Sandbox Code Playgroud)
类型列表上的切换案例只会在整个代码库中出现一次.如果添加新类型,任何不处理它的访问者在使用时都会产生编译时错误.
你也可以使用lambdas与一个或两个辅助函数一起内联; 特别适用于你有普通lambda的14.