【发布时间】:2019-11-16 04:50:06
【问题描述】:
当我尝试将函数作为模板模板类型参数传递给类时,遇到错误。为什么语言核心开发人员不会启用此功能?函子类模板可以传递,但函数模板不能。
例如在“g++ (Ubuntu 8.3.0-6ubuntu1) 8.3.0”中编译这段代码:
#include <iostream>
using namespace std;
template <template <typename> typename Functor>
class UseFunc
{
public:
void use()
{
Functor<int>(3);
Functor<char>('s');
}
};
template <typename T>
void func(T s)
{
cout << s << endl;
}
int main()
{
UseFunc<func> u {};
u.use();
}
告诉:
kek.cpp: In function ‘int main()’:
kek.cpp:24:14: error: type/value mismatch at argument 1 in template parameter list for ‘template<template<class> class Functor> class UseFunc’
UseFunc<func> u {};
^
kek.cpp:24:14: note: expected a class template, got ‘func’
kek.cpp:25:4: error: request for member ‘use’ in ‘u’, which is of non-class type ‘int’
u.use();
^~~
我希望它以与模板模板参数传递相同的方式实现。归根结底,这只是对编译器的请求,以便可以以通常的方式实例化和使用具体类型的函数。
真的不明白这个限制,如果有人能告诉我实现这个有什么困难,那就太好了。
【问题讨论】:
-
Functor应该是一个类型,而不是一个对象。事实上,模板是一个 meta 声明,你必须实例化它才能使用它。 -
@edurko Nikolaus 也许是因为模板模板参数可以用作类定义中的类型说明符。在这种情况下,声明与函数转换表达式或函数调用之间可能存在歧义。
-
您不能将函数传递给
template <typename> typename Functor,因为正如您自己所说,它是模板模板 type 参数,而func是函数模板而不是类型模板。 -
IMO 你把这件事弄得更复杂了:wandbox.org/permlink/nrbasc7jyj0KVbqN
标签: c++ function templates functor