С++. Может ли параметр шаблона шаблона быть переменной или функцией?

Я все еще пытаюсь полностью понять шаблоны. Я рассматриваю их как особый тип.

Недавно я читал о параметрах шаблона шаблона классов, и мне интересно, возможно ли иметь параметр шаблона шаблона функции или переменной, а не только класса? Что-то вроде этого:

template<typename T> void func(T); //template of function 'func'

template<int a> double var = a; //template of variable 'var'

template<template<typename> void templ_param() = func, //parameter template of function

template<int> double templ_param_0 = var //parameter template of variable

> void func1();

РЕДАКТИРОВАТЬ: Если нет, то почему и какова альтернатива?


person AnArrayOfFunctions    schedule 23.03.2015    source источник
comment
Вы перепутали декларации и определения. Что такое шаблон‹int›?   -  person The Vivandiere    schedule 23.03.2015
comment
Я предполагаю, что шаблон с одним параметром типа «int»?   -  person AnArrayOfFunctions    schedule 23.03.2015
comment
Вы угадали неправильно. такого нет   -  person The Vivandiere    schedule 23.03.2015
comment
template <typename T> class A { T var; }; и A<int> myObj   -  person The Vivandiere    schedule 23.03.2015
comment
@Golazo, да, это действительно основа для TMP.   -  person chris    schedule 23.03.2015


Ответы (2)


Мне интересно, возможно ли иметь параметр шаблона шаблона функции

Нет, ты не можешь. Фрагмент кода вашего примера не будет работать.

template <template <typename T>> void templ_param() = func,

Параметр шаблона шаблона должен быть шаблоном класса или шаблоном псевдонима.

Из стандарта С++:

14.3.3 Аргументы шаблона шаблона

1 аргумент-шаблона для шаблона параметр-шаблона должен быть именем шаблона класса или шаблона псевдонима, выраженным как выражение-идентификатора .

person R Sahu    schedule 23.03.2015

Нет, параметры шаблона шаблона могут быть только типами.

[temp.param]/1 описывает синтаксис параметра шаблона следующим образом:

параметр-шаблона:

  • тип-параметр
  • объявление параметра

тип-параметр:

  • type-parameter-key ...opt идентификаторopt
  • идентификатор ключа параметра-типаopt= идентификатор типа
  • template < список-параметров-шаблонов > ключ-типа-параметров ...opt идентификаторopt
  • template < список-параметров-шаблона > ключ-параметра-типа идентификаторopt= выражение-идентификатора< /эм>

тип-параметр-ключ:

  • class
  • typename

Таким образом, параметры шаблона шаблона помещаются в категорию параметров-типов, и действительно, их объявление должно содержать либо class, либо typename после template<...>

В качестве альтернативы вы можете обернуть функции шаблона и переменные в классы:

template <typename T>
struct FuncWrapper {
    static void func(T t) {
        std::cout << "in func " << t << std::endl;
    }
};

template <int a>
struct VarWrapper {
    static constexpr double var = a;
};

template<
    template <typename T> class FW = FuncWrapper,
    template <int> class VW = VarWrapper> 
void func1() {
    FW<int>::func(VW<42>::var);
}

int main() {
    func1<>();
}
person Anton Savin    schedule 23.03.2015
comment
Можете ли вы объяснить, почему и есть ли возможная альтернатива? - person AnArrayOfFunctions; 24.03.2015
comment
Насчет почему - думаю, лучше спросить у кого-нибудь из комитета ИСО, но даже если спросите, думаю, ответ будет такой: предложения по этому поводу не было. Что касается альтернативы - например, вы можете создать класс шаблона со статической функцией/переменной. - person Anton Savin; 24.03.2015
comment
@FISOCPP Я обновил свой ответ возможной альтернативой - person Anton Savin; 24.03.2015