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

Variadic C++ Templates Termination After Unpack?

我正在尝试使用 C++ 可变参数模板解压缩变量类型的参数列表,我将如何删除以下人工示例中的 "T" 对象:

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 { };

然后这样执行:

DummyObject dummy;
Test test;
test.foo(dummy, 4, 5.0, 6, 7.0, 8.0, 9);

我想完全不需要传入 "dummy" 对象,我只是想不出在这种情况下最终的 "foo" 函数应该是什么样子。

让我稍微充实一下您的示例:

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

另一种方法是删除递归调用并有类似的东西:

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