为泛型类型

时间:2018-03-05 16:00:51

标签: c++ templates

考虑这个简单但完整的例子:

#include <iostream>

enum class Foo
{
    A,
    B
};

template <Foo F>
struct X{};

template <Foo F>
constexpr Foo deduce_foo(X<F>&& arg)
{
    return F;
}

int main()
{
    if ( deduce_foo(X<Foo::B>{}) == Foo::A )
        std::cout << "A";
    else
        std::cout << "B";
    std::cout << std::endl;
}

正确推导出enum class(函数deduce_foo(...))。

现在,我想使它更通用,用模板T代替X,即:

template <Foo F, typename T>
constexpr Foo deduce_foo(T<F>&& arg) { ... }

但是编译器(g ++ 7.3.0)给了我这个错误:

  

错误:'T'不是模板   constexpr Foo deduce_foo(X&amp;&amp; arg)

我做错了什么?

1 个答案:

答案 0 :(得分:3)

您需要声明T是模板,请尝试:

template <Foo F, template<Foo> class T>
constexpr Foo deduce_foo(T<F>&& arg)
{
    return F;
}