为什么不能将模板函数作为模板模板参数传递?

时间:2019-07-05 14:27:26

标签: c++ function templates functor

当我尝试将函数作为模板模板类型参数传递给类时,遇到错误。为什么语言核心开发人员将无法启用此功能?可以传递函子类模板,但不能传递函数模板。

例如,在“ 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();                                                                                                                                   
    ^~~   

我希望它的实现方式与传递模板模板参数相同。归根结底,这只是对编译器的请求,因此可以实例化并以通常的方式使用具体类型的函数。

完全不了解此限制,如果有人可以告诉我实现此限制的难度,那将是很好的。

1 个答案:

答案 0 :(得分:2)

我不确定为什么C ++不提供函数模板参数的问题,但我想它与以下问题有关:

  • 对模板的任何不重要的更改都将需要进行复杂的分析,以确定需要对标准文本进行哪些更改
  • 此功能很少使用;毕竟,类模板模板参数主要用于部分专业化,即,以分派本身就是模板专业化的类型,而很少希望通过函数来​​做到这一点
  • 在不支持可以接受任何 non-template 函数的模板参数类型的情况下,支持功能模板模板参数是没有意义的(我们可以在C ++ 17中使用{ {1}},但是对于C ++ 98而言,拥有功能模板模板参数显然为时已晚)
  • 您仍然可以使用类模板来解决缺少功能模板模板参数的问题(类似于我们对部分专业化所做的工作)。
  • 函数重载使事情复杂化。在存在重载的情况下,无法明确命名特定的函数模板。应该提供一个吗?或者,我们是否认为应该将重载集作为一个整体传递给功能模板参数?如果过载解析然后选择了非模板过载怎么办?在没有引人注目的用例的情况下,我们如何甚至回答这些设计问题?

如果您相信自己知道如何解决所有这些问题,并且尤其可以提供一个令人信服的论点,说明尽管语言复杂,我们仍需要使用此功能,我们可以使用类来解决它的缺失模板参数,请随时为标准编写建议。