可变参数C ++模板解压缩后会终止吗?

时间:2018-07-12 23:33:49

标签: c++ variadic-templates variadic-functions variadic

我正在尝试使用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”函数应该是什么样子。

2 个答案:

答案 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) { }
};

因此,有两个函数可以实际工作:doIThingdoDThing。您对它的理解正确率为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() { }
};

在这里运行:http://coliru.stacked-crooked.com/a/b35ac716cf2960b3

答案 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);