最近用 C++的时候遇到了对variadic template 解包的问题,在 StackOverflow 上也找了好多,但始终没形成一个好的思路,所以来 V 站求助下。
问题如下:
采用 C++ 14 。
函数接受至少一个参数,可能有多个参数,第一个参数 arg1 是确定的类型 T 。后面的参数 args 会有不同的类型, 如 int/ string /custom_class 等.
根据 args 参数不同,调用不同的函数,或者是返回 bool 类型。
args
中含 int, 则认为传入的是 dim, 执行 funcDim()
;args
中含 string, 则认为传入的是 name, 执行 funName()
.想把主函数指针写成如下形式:
template <typename T, typename ... Ts>
auto funcPtr = std::function< bool (T arg1, Ts ... args)>;
请问:
std::make_tuple(args ...)
, 但这个感觉不是很优雅,而且转换一次有效率损失。请问有什么好的方法呢? 1
boyhailong 2020-11-27 10:14:39 +08:00
|
2
Yienschwen 2020-11-27 15:11:54 +08:00
你的需求不是特别清楚……所以不是很明白为什么你觉得递归解包不方便
关于你问题的第二点,这会令你的入口函数能够在运行时接受不同类型的参数,我感觉这一点只有类似于[va_arg]( https://en.cppreference.com/w/cpp/utility/variadic/va_arg),但这样类型信息需要你预先知道,反而是静态多态容易处理这个问题。 |
3
Yienschwen 2020-11-27 15:23:51 +08:00
如果你对参数的顺序没有任何约束,那比如你要把某个`int`取出来时,你其实也不知道这个`int`在什么位置,那你用`tuple`其实也不解决问题。另外,如果你哪怕用了`tuple`,只要你小心地控制是否拷贝(比如用`tuple<const Targs& ...>`,其实大多数编译器都能优化,没有什么额外开销。
我在 [godbolt]( https://godbolt.org/z/9j9zGv) 大概看了一下,应该能说明问题。 |