使用非类型参数包失败的C ++模板专业化

时间:2017-06-13 12:51:00

标签: c++ templates variadic-templates non-type

我的问题可能与this one有关,但我认为我没有"部分专业的非类型参数表达式"在这里,或者不理解这种关系。

以下代码使用MSVC14编译器(CPP11)产生内部错误:

template<typename T, T... Elmts>
struct NonTyped
{

};

template<typename T>
struct is_NonTyped_of_type
{
    template<typename TL>
    static constexpr bool check = false;

    template<T... Elmts>
    static constexpr bool check<NonTyped<T, Elmts...>> = true;
};

cout << is_NonTyped_of_type<int>::check<NonTyped<int, 5>> << endl;

只使用一个非类型参数而不是非类型参数包将按预期工作,但这会失败。

标准是禁止还是未定义?它破坏了什么规则?

任何解决方法?

非常感谢!

修改

solution给出的@StoryTeller实际上并不适用于MSVC14,但对于理解我们在这里遇到的问题非常有帮助。非常感谢你的帮助,StoryTeller!

1 个答案:

答案 0 :(得分:2)

Clang接受你的代码,而GCC没有。您的变量模板的部分特化应该是可以的。您可以随时回到使用常规类模板进行实际计算的久经考验的方法。

template<typename T>
class is_NonTyped_of_type
{
    template<typename TL>
    struct check_impl : std::false_type {};

    template<T... Elmts>
    struct check_impl<NonTyped<T, Elmts...>> : std::true_type {};

public:
    template<typename TL>
    static constexpr bool check = check_impl<TL>::value;
};