Как использовать параметр шаблона в другом объявленном ранее параметре шаблона
-
22-07-2019 - |
Вопрос
параметр шаблона может использоваться в другом параметре шаблона, который следует за ним следующим образом:
template<typename T, T N>
struct s
{
};
Но можно ли ссылаться на "T"? если он объявлен после " N "
Это не работает.
template<T N, typename T>
struct s
{
};
Можем ли мы помочь компилятору, предварительно объявив " T " или делать что-то еще?
Заранее спасибо.
РЕДАКТИРОВАТЬ: так как в первых двух ответах спрашивалось "почему вы готовы это сделать?" Я объясню цель:
Я бы хотел, чтобы компилятор выводил тип " T " чтобы облегчить использование шаблонных классов.
Например:
template<typename T, T A, T B>
struct sum
{
static T const value = A + B;
};
Этот шаблон можно использовать следующим образом:
sum<int, 1, 2>::value
Но было бы лучше, если бы его можно было использовать таким образом:
sum<1, 2>::value
Технически это должно быть возможно, потому что компилятор знает типы " 1 " и "2"; : " int " ;, и фактически он использует эту информацию, чтобы найти наилучшую перегрузку для функции. Итак, объявив шаблон таким образом:
template<T A, T B, typename T>
struct sum
{
static T const value = A + B;
};
компилятор может использовать свою возможность для вывода последнего параметра из информации, предоставленной первым и вторым, и затем найти лучший шаблон для создания экземпляра.
Решение
Как и другие говорят: нет, это невозможно, компилятор не может определить тип T
из не типовых аргументов template (в случае функции, он выводит типы из аргументов function ):
<код> 14.8.2.4/12 код>:
Аргумент типа шаблона не может быть выведен из типа нетипичного аргумента шаблона. Р>
В любом случае, для аргументов шаблона класса вычеты не будут сделаны. Примером шаблона функции может быть
template<int> struct having_int { };
template<typename T, T i> void f(having_int<i>);
int main() { having_int<0> h; f(h); }
В этом случае T
не будет выводиться как int
- вы должны явно указать его. Р>
Другие советы
Ты не можешь. Я не вижу смысла, почему вы делаете это тоже.
Ниже дрянь, потому что я не прочитал ваш вопрос должным образом.
Действительно, я не вижу смысла в том, чего вы пытаетесь достичь. Р>
#include <iostream>
template<typename T, T N>
struct s
{
T size() { return N; }
};
int main()
{
s<int, 4> x;
std::cout << x.size()<< '\n';
//s<float, 3.14> f; //this doesn't compile
}
Это скомпилировано для меня с GCC и Comeau Online.
Думаю, проблема в типе T, который вы пытаетесь использовать. Аргументы шаблонного типа не только поддерживают целочисленные типы, а затем указатели на объекты с внешней связью (или что-то подобное и, возможно, несколько других очень ограниченных вещей).