Как сделать шаблонную специализацию типизированного параметра? - PullRequest
0 голосов
/ 26 июня 2018

У меня есть следующий код:

#include <tuple>
#include <utility>
#include <iostream>

template<class T>
struct e {

};

template <>
struct e<int N> {
    static const int value = N;
};

int main() {
    std::cout << e<5>::value << std::endl;
}

Что дает мне несоответствие типов. Я понимаю, что 5 - это значение r, поэтому я предполагаю, что мое решение может выглядеть как

e<int &&N>

но это тоже не работает. Что я могу сделать, чтобы сделать это в общем? Также я использую терминологию право callint <int N> параметр типизированного шаблона, где <typename/class T> - параметр нетипизированного шаблона?

1 Ответ

0 голосов
/ 26 июня 2018

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

template <int N> 
struct e
{ static const int value = N; };

И тогда вы будете специализироваться на конкретных значениях. Конечно, для вашего примера, при условии, что вы используете только instaciante со значениями int, приведенный выше шаблон - это все, что нужно, и никакой специализации.

Однако, предполагая, что могут использоваться другие типы, вы можете частично специализироваться на std::integral_constant или аналогичном, что позволяет вместо этого специализироваться на типе (который включает значение int).

Что-то вроде,

#include <iostream>
#include <type_traits>

template<class T>
struct e {

};

template <int N>
struct e<std::integral_constant<int,N> > {
    static const int value = N;
};

int main() {
    std::cout << e<std::integral_constant<int,5>>::value << std::endl;
}

Демо

...