模板化类中的Is_foo结构

is_foo struct inside a templated class

本文关键字:Is foo 结构      更新时间:2023-10-16

我有一个foo结构模板上的size_t。我想写一个is_foo结构体,当且仅当T对于某些N看起来像foo<N>时,is_foo<T>::value为真。以下是我的问题的一个最小示例:

template<typename T>
class Bar {
public:
    template<size_t N> struct foo{};
    template<typename> struct is_foo : std::false_type{};
    template<size_t N> struct is_foo<foo<N>> : std::true_type{};
    template<typename = std::enable_if<is_foo<foo<0>>::value>::type>
    Bar(int x) {}
};

我的问题是main中的Bar<double> b(5);无法编译,这意味着is_foo<foo<0>>::value原来是false。然而,如果我从class Bar的声明中删除template<typename T>,那么Bar b(5)将编译良好。我怎样才能使is_foo表现出我想要的方式?

我的问题是Bar<double> b(5);在main中编译失败,这意味着is_foo<foo<0>>::value原来是false

没有。

+ g++ -std=c++14 -O2 -Wall -pedantic -pthread main.cpp
main.cpp:10:25: error: need 'typename' before 'std::enable_if<Bar<T>::is_foo<Bar<T>::foo<0ul> >::value>::type' because 'std::enable_if<Bar<T>::is_foo<Bar<T>::foo<0ul> >::value>' is a dependent scope
     template<typename = std::enable_if<is_foo<foo<0>>::value>::type>
                         ^
[snip]
+ clang++ -std=c++14 -O2 -Wall -pedantic -pthread main.cpp
main.cpp:10:25: error: missing 'typename' prior to dependent type name 'std::enable_if<is_foo<foo<0> >::value>::type'
    template<typename = std::enable_if<is_foo<foo<0>>::value>::type>
                        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                        typename