параметр шаблона может использоваться в другом параметре шаблона, который следует за ним следующим образом:
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;
};
компилятор может использовать свою возможность для вывода последнего параметра из информации, предоставленной первым и вторым, и затем найти лучший шаблон для создания экземпляра.