Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;具有两个参数的参数包递归_C++_Templates_Variadic Templates_Template Argument Deduction - Fatal编程技术网

C++ C++;具有两个参数的参数包递归

C++ C++;具有两个参数的参数包递归,c++,templates,variadic-templates,template-argument-deduction,C++,Templates,Variadic Templates,Template Argument Deduction,我有一个模板类,它使用两种类型: template<typename T1,typename T2> class Foo { ... }; 如果我只使用一个模板参数实现类Foo,那么它工作得很好。 但是对于两个(或更多)参数,编译器抱怨Foo需要两个参数 当类Foo有多个模板参数时,是否可以实现参数包转发?您的错误是Foo*。。。o参数。 将该参数解包为模板包a、B、C、D、E将产生与o参数一样多的参数:Foo、Foo、Foo, 在我看来,如果您只是将您的参数声明为Other,并且

我有一个模板类,它使用两种类型:

template<typename T1,typename T2> class Foo { ... };
如果我只使用一个模板参数实现
类Foo
,那么它工作得很好。 但是对于两个(或更多)参数,编译器抱怨
Foo
需要两个参数

类Foo
有多个模板参数时,是否可以实现参数包转发?

您的错误是
Foo*。。。o
参数。 将该参数解包为模板包
a、B、C、D、E
将产生与
o
参数一样多的参数:
Foo、Foo、Foo,

在我看来,如果您只是将您的参数声明为
Other
,并且如果它们与以后的任何
Foo
实例化不匹配,则让递归失败,这会更简单:

template <typename T1, typename T2, typename... Others> size_t getSize(Foo<T1,T2> *f, Others... *o) { ... };
您还可以添加类型特征来直接执行检查:

template <class T> struct IsFoo : std::false_type {};
template <class T, class U> struct IsFoo<Foo<T,U>> : std::true_type {};

template </* ... */>
std::enable_if_t<std::conjunction<IsFoo<Others>::value...>::value, size_t> getSize(/* ... */)
模板结构IsFoo:std::false_type{}; 模板结构IsFoo:std::true_type{}; 模板 std::如果获取大小(/*…*/)则启用 那怎么办

template <typename ... Ts1, typename ... Ts2>
std::size_t get_size (Foo<Ts1, Ts2> * ... fs)
 { /* ... */ }
模板
std::size\u t get\u size(Foo*…fs)
{ /* ... */ }
?

或者,也许

template <typename T1, typename T2, typename ... Us1, typename ... Us2>
std::size_t get_size (Foo<T1, T2> * f, Foo<Us1, Us2> * ... fs)
 { /* ... */ }
模板
std::size\u t get\u size(Foo*f,Foo*…fs)
{ /* ... */ }

如果您希望以不同方式管理第一个
Foo

基本上,包中必须有偶数个参数,并且必须使用它们来推断函数参数。这可能直接适用于C++20概念(必须仔细考虑),但对于C++17及更早版本,可能需要使用一些间接方法,以及一些帮助器类和函数。现在,您打算在函数本身中对模板参数做什么?这个推论是必要的吗?我很确定它是重复的——我应该把另一个问题保存在书签中。如果是这样的话,一小时后会回来标记它。不,它不应该是
Foo
,因为
Foo
正好有两个模板参数。对不起,误读了问题。两次,目标是什么?它是‘getSize(Foo*,Foo*,Foo*)吗?很有用!不知道您可以使用多个arg包。@dexter-更新的低估了dar的威力。。。嗯。。。我是说。。。可变模板的扭曲。
template <typename ... Ts1, typename ... Ts2>
std::size_t get_size (Foo<Ts1, Ts2> * ... fs)
 { /* ... */ }
template <typename T1, typename T2, typename ... Us1, typename ... Us2>
std::size_t get_size (Foo<T1, T2> * f, Foo<Us1, Us2> * ... fs)
 { /* ... */ }