【问题标题】:Why can't template functions be passed as a template template parameter?为什么模板函数不能作为模板模板参数传递?
【发布时间】: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 &lt;typename&gt; typename Functor,因为正如您自己所说,它是模板模板 type 参数,而 func 是函数模板而不是类型模板。
  • IMO 你把这件事弄得更复杂了:wandbox.org/permlink/nrbasc7jyj0KVbqN

标签: c++ function templates functor


【解决方案1】:

对于C++为什么不提供函数模板模板参数的问题我不确定答案,但我想这与它有关:

  • 对模板的任何重大更改都需要复杂的分析来确定需要对标准文本进行哪些更改
  • 此功能将很少使用;毕竟,类模板模板参数主要用于部分特化,即, 用于调度本身就是模板特化的类型,而函数很少会这样做
  • 如果不支持可以接受任何 非模板 函数的模板参数类型,就支持函数模板模板参数是没有意义的(我们可以在 C++17 中使用 @ 987654321@ 但这对于 C++98 来说显然为时已晚,没有函数模板模板参数)
  • 无论如何,您都可以使用类模板来解决缺少函数模板模板参数的问题(有点像我们对部分特化所做的)。
  • 函数重载使事情复杂化。在重载的情况下,没有办法明确地命名一个特定的函数模板。应该提供一个吗?或者,我们是否认为重载集应该作为一个整体传递给函数模板模板参数?如果重载决议然后选择非模板重载怎么办?我们如何在没有令人信服的用例的情况下回答这些设计问题?

如果您认为自己知道如何解决所有这些问题,尤其是可以提供令人信服的论据,说明为什么我们需要该语言中的此功能,尽管它会很复杂,我们可以使用类来解决它的缺失模板模板参数,请随时为标准编写提案。

【讨论】:

  • 哇。这是一个列表!谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-25
  • 1970-01-01
  • 2011-09-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多