我已经在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] 删除。
我来说两句