Как использовать параметр шаблона в другом объявленном ранее параметре шаблона - PullRequest
7 голосов
/ 19 сентября 2009

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

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;
};

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

Ответы [ 3 ]

8 голосов
/ 19 сентября 2009

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

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 - вы должны явно указать его.

0 голосов
/ 19 сентября 2009

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

Действительно, я не вижу никакого смысла в том, чего вы пытаетесь достичь.

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

0 голосов
/ 19 сентября 2009

Вы не можете. Я не вижу смысла, почему вы делаете это тоже.

...