可以将变量模板作为模板模板参数传递吗?


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

尝试编译器资源管理器

Answers:


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
@ formerlyknownas_463035818我认为还没有人提出它(从未在论文中看到它,也许我错过了?)而且也很复杂。现在,非类型模板参数是pr值。但是那value<T>意味着什么呢?引用全局变量?同样,您不能ODR使用非类型模板参数,但是可以使用全局模板。
Guillaume Racicot

感谢您的提示,我仍然使用c ++ 11,所以我对变量模板不太熟悉,这就是我本来希望可以直接使用的东西
idclev 463035818 19/10/28
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.