Почему функции шаблона не могут быть переданы в качестве параметра шаблона? - PullRequest
7 голосов
/ 05 июля 2019

Когда я пытаюсь передать функцию в качестве параметра типа шаблона шаблона в класс, произошла ошибка.Почему разработчики языкового ядра не включают эту возможность?Шаблоны классов 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 Ответ

2 голосов
/ 05 июля 2019

Я не знаю наверняка, ответ на вопрос, почему C ++ не предоставляет параметры шаблона шаблона функции, но я думаю, что это как-то связано с:

  • Любое нетривиальное изменение шаблонов потребует сложного анализа, чтобы определить, какие изменения необходимо внести в стандартный текст
  • Эта функция будет использоваться редко; в конце концов, параметры шаблона шаблона класса чаще всего используются в частичных специализациях, , т. е. , для диспетчеризации типов, которые сами являются шаблонными специализациями, и редко требуется делать это с функциями
  • Не имеет смысла поддерживать параметры шаблона шаблона функции, не поддерживая также тип параметра шаблона, который бы принимал любую не-шаблонную функцию (мы можем сделать это в C ++ 17 с auto но это явно слишком поздно для C ++ 98 иметь параметры шаблона шаблона функции)
  • Вы можете обойти отсутствие параметров шаблона шаблона функции, используя шаблоны классов в любом случае (вроде как мы делаем с частичными специализациями).
  • Перегрузка функций усложняет ситуацию. При наличии перегрузки невозможно однозначно назвать конкретный шаблон функции. Должен ли он быть предоставлен? Или мы принимаем точку зрения, что набор перегрузки предназначен для передачи в целом в параметр шаблона шаблона функции? Что, если разрешение перегрузки выберет не шаблонную перегрузку? Как мы можем даже ответить на эти вопросы дизайна, не имея убедительного варианта использования?

Если вы считаете, что знаете, как решить все эти проблемы, и, в частности, можете предоставить убедительный аргумент в пользу того, почему нам нужна эта функция в языке, несмотря на то, что она будет сложной и мы можем обойти ее отсутствие, используя класс Параметры шаблона шаблона, не стесняйтесь, пишите предложение по стандарту.

...