C++ 11 std ::在运行时有条件?

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标识符?

Nir*_*man 5

必须在编译时解析所有类型.因此,没有类型可以依赖于函数的运行时参数.处理这样的事情的方法基本上是建立一个访问机制,然后你可以重用它.基本上,这样的事情:

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.