我的问题可能与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!
最佳答案
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;
};