C++多变量模板未绑定到函数参数
C++ Multiple variadic template not binded to function arguments
我试图使用一些可变模板参数,但很快就被一个我无法理解的错误阻止了。
#include <tuple>
template <typename T>
struct Foo
{
typedef T type;
};
// return a tuple of pair of args and Foo templated on Types
template <typename Head, typename ...Args, typename Type, typename ...Types>
auto func(Head arg, Args... args)
{
return std::tuple_cat(std::make_tuple(std::make_pair(arg, Foo<Type>())),
func<Args..., Types...>(args...));
}
template <typename Head, typename Type>
auto func(Head arg)
{
return std::make_tuple(std::make_pair(arg, Foo<Type>()));
}
int main()
{
func<int, bool, char>(1, 2, 3);
}
在这里,func试图解压缩模板参数,并在第二个可变模板上模板化func参数和Foo结构的元组,但我有:
test.cc:25:3: error: no matching function for call to 'func'
func<int, bool, char>(1, 2, 3);
^~~~~~~~~~~~~~~~~~~~~
test.cc:11:6: note: candidate template ignored: couldn't infer template argument 'Type'
auto func(Head arg, Args... args)
^
test.cc:18:6: note: candidate function template not viable: requires single argument 'arg', but 3
arguments were provided
auto func(Head arg)
^
1 error generated.
为什么无法推断类型?(gcc也告诉我)
我确信在seing std::tuple_cat实现后,多变量模板是可能的(https://gcc.gnu.org/onlinedocs/libstdc++/libstdc++-api-4.5/a01066_source.html),我认为这是一个简单的例子,如果有解决方案或标准不接受,应该有人比我更清楚。
感谢您的帮助,
将推导的参数放在最后。
...
模板参数是贪婪的——它们会消耗传入的参数,不会为以后的模板参数"保存"任何参数。
一旦完成,就会从非模板函数参数中进行推导。
像这样交换:
template <typename Type, typename ...Types, typename Head, typename ...Args>
auto func(Head arg, Args... args)
另外,去掉其他过载,所以func<int,int>(3)
是不含糊的。
这使得递归中断,但很容易修复:
template <class... Types, class... Args>
auto func(Args... args)
{
return std::make_tuple(std::make_pair(args, Foo<Types>())...);
}
它的好处是漂亮又矮。
这里的一个关键数据点是可变参数将由一个空列表匹配。这有几个后果。
第一个结果是给定以下模板声明:
template <typename Head, typename ...Args, typename Type, typename ...Types>
以及以下实例化:
<int, bool, char>
实例化可以通过几种方式与模板匹配:
1.
Head int
...Args bool
Type char
... Types (empty list)
2.
Head int
...Args (empty list)
Type bool
... Types char
所以,这是歧义的一个来源。main()
中的引用可以与任一模板定义相匹配。尽管在某些情况下,有各种晦涩的规则可以解决这种歧义,但最好不要依赖晦涩的模板消歧规则,或者至少不要使用几种标准的基本SFINAE
方法。
但是,回到主题上,编译器马上就要落后于八个球,没有明确的候选者来解决main()
中的模板引用。但情况越来越糟。给定
auto func(Head arg, Args... args)
和
auto func(Head arg)
因为,再一次,一个变量参数,在这种情况下是Args...
,可以匹配一个空列表,那么,例如:
func(4)
可以匹配任一函数签名。
将所有这些因素结合在一起,编译器就无法在这里真正做到有头有尾。
- 传递给 lambda C++绑定函数
- 是否可以将绑定函数存储在容器中?
- C++绑定函数到指针
- 我正在尝试制作一个在 std::bind 之前匹配的网络绑定函数
- 用emscripten中的参考参数绑定函数
- C++-模板函数接受绑定函数作为参数并将其传递给另一个函数
- 将绑定函数分配给 std::函数
- C++中的绑定函数结果
- 绑定函数而不提供参数类型
- std::bind 一个绑定函数
- 创建具有提升绑定/函数的菜单处理程序
- C++绑定函数以用作其他函数的参数
- C++ Boost::bind:指向绑定函数的指针只能用于调用该函数
- 如何指定可能接受 boost::绑定函数的 C++ 函数指针
- 指向绑定函数的指针只能用于调用该函数
- boost::spirit绑定函数,提供参数为spirit:qi::_val
- 套接字绑定函数编译错误
- 在绑定函数/使用lambdas测试消息传递代码时遇到麻烦
- 错误:指向绑定函数的指针只能用于调用该函数
- Windows套接字api绑定函数编译问题