Может ли переменный шаблон передаваться как аргумент шаблона шаблона?

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

Попробуйте в Compiler Explorer

invexed
источник

Ответы:

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
@ прежние известныеas_463035818 Я не думаю, что кто-то еще предлагал это (никогда не видел это в газете, возможно я пропустил это?) И есть сложность также. Прямо сейчас, нетипичные параметры шаблона являются pr-значениями. Но что бы value<T>это значило? Ссылка на глобальную переменную? Кроме того, в ODR нельзя использовать параметр шаблона нетипичного типа, но вы можете использовать глобальный шаблон.
Гийом Расикот
спасибо за подсказки, я все еще на c ++ 11, так что я не слишком знаком с переменными шаблонами, и это то, что я ожидал бы работать из коробки
idclev 463035818