Как использовать параметр шаблона в другом объявленном ранее параметре шаблона

StackOverflow https://stackoverflow.com/questions/1447141

Вопрос

параметр шаблона может использоваться в другом параметре шаблона, который следует за ним следующим образом:

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, который вы пытаетесь использовать. Аргументы шаблонного типа не только поддерживают целочисленные типы, а затем указатели на объекты с внешней связью (или что-то подобное и, возможно, несколько других очень ограниченных вещей).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top