可变参数 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) { }
};
因此有两个函数在执行实际工作: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() { }
};
另一种方法是删除递归调用并有类似的东西:
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);
我正在尝试使用 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) { }
};
因此有两个函数在执行实际工作: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() { }
};
另一种方法是删除递归调用并有类似的东西:
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);