Чи може змінний шаблон передаватися як аргумент шаблону шаблону?


11

Наведений нижче безглуздий приклад не компілює, але чи є інший спосіб передати змінний шаблон як аргумент шаблону шаблону?

template<typename T>
constexpr auto zero = T{0};

template<typename T, template<typename> auto VariableTemplate>
constexpr auto add_one()
{
    return VariableTemplate<T> + T{1};
}

int main()
{
    return add_one<int, zero>();
}

Спробуйте в Провіднику компілятора

Відповіді:


3

Коротка відповідь: Ні.

Довга відповідь: Так, ви можете використовувати деяку непряму через шаблон класу:

template<typename T>
constexpr auto zero = T{0};

template<typename T>
struct zero_global {
    static constexpr auto value = zero<T>;
};

template<typename T, template<typename> class VariableTemplate>
constexpr auto add_one()
{
    return VariableTemplate<T>::value + T{1};
}

int main()
{
    return add_one<int, zero_global>();
}

Живий приклад


здається трохи назад, що доводиться вдаватися до структури зі статичним членом. Це щось, що можна очікувати, щоб прийти з майбутнім стандартом? Будь-яка ідея, чому це не можливо вже сьогодні?
idclev 463035818

1
@ bivlyknownas_463035818 Я не думаю, що його ще ніхто не пропонував (ніколи не бачив його в папері, можливо, я пропустив його?) І тут теж є складність. Зараз параметр шаблону нетипового типу є pr-значеннями. Але що value<T>б означало? Посилання на глобальну змінну? Крім того, ви не можете використовувати ODR параметр нетипового шаблону, але ви можете використовувати шаблон глобальний.
Гійом Ракікот

дякую за підказки, я все ще перебуваю на c ++ 11, тому я не надто знайомий зі змінними шаблонами, і це те, що я б очікував працювати поза коробкою
idclev 463035818
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.