gpt4 book ai didi

C++11 std::conditional 在运行时?

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:10:42 25 4
gpt4 key购买 nike

我想做这样的事情:

void func(void *data, const int dtype)
{
typedef typename std::conditional<dtype==0,float,double>::type DataType;

funcT((DataType *)data);

return;
}

这不会编译,因为 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));
}

现在可以通过写访问者来实现功能了:

struct func_impl {
void operator()(float&) { ... }
void operator()(double&) { ... }
};

您的访问者也可以使用通用代码:

struct func_impl2 {
template <class T>
void operator()(T&) { ... }
};

然后您可以利用访问者编写您的函数:

void func(void* data, const int dtype) {
visit_data(data, dtype, func_impl{});
}

类型列表中的 switch case 在整个代码库中只会出现一次。如果您添加一个新类型,任何不处理它的访问者都会在使用时给出编译时错误。

您还可以使用 lambda 与一两个辅助函数内联执行此操作;在具有通用 lambda 的 14 中特别有用。

关于C++11 std::conditional 在运行时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46122491/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com