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

马尼姆

我已经在C ++ 11中编写了以下短代码,其中包含可变模板函数,并将参数存储到boost :: any类型的向量中。它运行良好,但是我不想使用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:由于上述代码的目标是assignment,因此创建额外的数据结构(向量)是没有用的。查看'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和运行时检查,因为如果没有通用类型,这将在编译时失败。而且,如果您只想遍历参数,则向量可能会过大...所以类似:

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*-进行调用。您可能需要在必要时分别处理这种情况。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

clang不使用可变参数推断可变参数模板函数中的模板参数

如何在不使用显式的情况下安全地允许单参数模板化构造函数?

如何在不使用C ++创建函数对象的情况下将函数指针作为模板值参数传递?

使用可变参数模板构建函数参数

使用可变参数类模板的模板参数调用可变参数函数模板?

使用成员函数调用可变参数模板函数

如何在函数的参数中不使用类型的情况下指定函数的类型?

c ++ 03:使用boost的可变参数模板

如何正确使用可变参数模板函数

我可以在不使用 va_arg 函数的情况下遍历可变参数列表吗?

使用可变参数模板将指针传递给成员

在VS2013中使用可变参数模板时“对重载函数的歧义调用”

Nodejs Express 在不使用 url 参数的情况下提供相同的可变页面

如何在不使用“参数”的情况下计算JavaScript函数的参数数量?

如何使用可变参数模板参数进行模板函数调用?

带有可变参数模板参数的boost :: format

使用可变参数模板的工厂模式?

使用可变参数模板扩展

使用可变参数模板打印列表

在可变参数模板中使用对

MSVC在使用constexpr的可变参数模板方法中从基本模板参数中吞下const,如果

在不使用面向对象代码结构的情况下,将许多参数传递给脚本中的许多函数的更干净的方法?

如何在不使用autosys更改日期参数的情况下运行存储过程

使用来自 std::vector 的参数调用可变参数模板化函数

在不使用typedef的情况下声明块方法参数

picocli:在不使用样板的情况下解析参数

将类型特征与可变参数模板参数一起使用

无法将std :: bind与可变参数模板参数一起使用

如何使用折叠表达式实例化可变参数模板函数中的每种类型?