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

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

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

1 Ответ

3 голосов
/ 28 октября 2019

Короткий ответ: Нет.

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

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

Живой пример

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...