最近用 C++的时候遇到了对variadic template 解包的问题,在 StackOverflow 上也找了好多,但始终没形成一个好的思路,所以来 V 站求助下。
问题如下:
采用 C++ 14 。
函数接受至少一个参数,可能有多个参数,第一个参数 arg1 是确定的类型 T 。后面的参数 args 会有不同的类型, 如 int/ string /custom_class 等.
根据 args 参数不同,调用不同的函数,或者是返回 bool 类型。
- 比如,
args中含 int, 则认为传入的是 dim, 执行funcDim(); - 若是,
args中含 string, 则认为传入的是 name, 执行funName(). - 上述的 funcDim() , funcName() 是 lambda 函数,但因为觉得对问题没有帮助所以省略。
想把主函数指针写成如下形式:
template <typename T, typename ... Ts>
auto funcPtr = std::function< bool (T arg1, Ts ... args)>;
请问:
- 这个要如何在这种 variadic functions 中进行解包呢? 网上的大多数是采用 recursive 的方式,但如果不采用 recursive 方式,如何比较简单的解包?
我认为一个比较清楚的方式是把 args 转成 tuple,即调用
std::make_tuple(args ...), 但这个感觉不是很优雅,而且转换一次有效率损失。请问有什么好的方法呢? - 如果这种解包不可能,我能否写三个重载函数,然后用同一个函数指针作为入口, 在运行时指向不同的函数? 即写三个函数 func(arg1) , func(arg1, int1), func(arg1, string1) 这种,然后用 funcPtr 运行时动态的绑定。
- 有没有更优雅的方案?
