我正在尝试使用C ++可变参数模板来解压缩变量类型的参数列表,在下面的人工示例中,如何删除“ T”对象:
top_widget = self
while top_widget.parentWidget(): top_widget = top_widget.parentWidget()
然后像这样执行:
struct Test
{
template <typename T, typename... Args>
void foo(T t, int i, Args... args) { foo(t, args...); }
template <typename T, typename... Args>
void foo(T t, double d, Args... args) { foo(t, args...); }
template <typename T>
void foo(T t) { }
};
struct DummyObject { };
我想完全消除传递“虚拟”对象的需要,我只是不知道在这种情况下最终的“ foo”函数应该是什么样子。
答案 0 :(得分:3)
让我稍微充实您的样品:
struct Test
{
template <typename T, typename... Args>
void foo(T t, int i, Args... args) { doIThing(i); foo(t, args...); }
template <typename T, typename... Args>
void foo(T t, double d, Args... args) { doDThing(d); foo(t, args...); }
template <typename T>
void foo(T t) { }
};
因此,有两个函数可以实际工作:doIThing
和doDThing
。您对它的理解正确率为99%,只是...删除T。
struct Test
{
template <typename... Args>
void foo(int i, Args... args) { doIThing(i); foo(args...); }
template <typename... Args>
void foo(double d, Args... args) { doDThing(d); foo(args...); }
void foo() { }
};
答案 1 :(得分:2)
其他方法是删除递归调用,并具有以下内容:
struct Test
{
template <typename... Args>
void foos(Args... args)
{
(foo(args), ...); // C++17 fold expression
#if 0 // C++11 or C++14
const int dummy[] = {0, (foo(args), 0)...};
static_cast<void>(dummy); // avoid warning for unused variable
#endif
}
void foo(int t) { /*...*/ }
void foo(double t) { /*...*/ }
template <typename t> void foo(T t) { /**/ }
};
然后使用它:
Test test;
test.foos(4, 5.0, 6, 7.0, 8.0, 9);