C++ 多变参数模板未绑定(bind)到函数参数

标签 c++ templates c++14 variadic

我试图使用一些可变模板参数,但我很快就被一个我无法理解的错误阻止了。

#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 告诉我同样的)

我确信在使用 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>())...);
}

它具有美观和简短的优点。

关于C++ 多变参数模板未绑定(bind)到函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34503434/

相关文章:

c++ - 在构造之前绑定(bind)对对象的引用

c++ - 获取另一个进程中变量的地址

c++ - 非标准 gnu 案例范围的标准替代方案

c++ - 确保仅从对象的创建线程调用方法

c++:根据类型的值进行模板

python - 如何在Cheetah for Python中正确使用多维字典?

templates - Helm _helpers.tpl : Calling defined templates in other template definitions

C++ "system(command)"不适用于 NetBeans/Windows

c++ - 返回可中断线程的函数

c++ - Vista 中的 C/C++ 编程