gpt4 book ai didi

c++ - 在不使用 boost::any 的情况下将参数存储在可变参数模板函数中

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

我在 C++11 中编写了以下短代码的变量模板函数,并将参数存储到 boost::any 类型的 vector 中。它运行良好,但我不想使用 boost::any 库(由于某些限制)。

#include <boost/any.hpp>

template <class Var, class... Args>
void cpp_for(Var *variable, uint32_t numParams, Args... args)
{
std::vector<boost::any> arguments{args...};

if(arguments.size() != numParams)
throw std::runtime_error("mismatch");

for(uint32_t i = 0; i < numParams; ++i)
variable[i] = *(boost::unsafe_any_cast<Var>(&arguments[i]));
}

我这样调用这个函数:

cpp_for(myObj->var, 3, 0x56, 0x23, 0x10);

或者

cpp_for(myObj2->var, 2, myObj2->var2, myObj2->var3);

有没有什么方法可以存储参数并一个一个地处理它们而不需要 boost::any?

编辑 1:我的参数都是同一类型。

编辑 2:由于上面代码的目标是赋值,因此创建一个额外的数据结构( vector )是没有用的。查看“Nir Friedman”的答案以获得更有效的解决方案。

最佳答案

你可以使用 std::common_type ,例如:

template <class Var, class... Args>
void CPP_FOR(Var *variable, uint32_t numParams, Args... args)
{
std::vector<std::common_type_t<Args...>> arguments{args...};
// do stuff with arguments
}

您还可以删除 numParams 和运行时检查,因为如果没有通用类型,这将在编译时失败。而且,如果您只想遍历参数,那么 vector 可能有点矫枉过正……所以像这样:

template <class Var, class... Args>
void CPP_FOR(Var *variable, Args... args)
{
std::common_type_t<Args...> arguments[]{args...};
for(size_t i = 0; i < sizeof...(Args); ++i)
variable[i] = /* ... */;
}

请注意,如果 sizeof... (Args) 为 0,即您仅使用 Var* 进行调用 - 您可能需要处理如有必要,请单独说明此案例。

关于c++ - 在不使用 boost::any 的情况下将参数存储在可变参数模板函数中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45642913/

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