1
#include <iostream>
#include <type_traits>
template<typename Head, typename... Tail>
struct Is_Admitted {
constexpr static bool value = Is_Admitted<Head>::value && Is_Admitted<Tail...>::value;
};
template<>
template<typename T>
struct Is_Admitted<T> : public std::false_type{};
template<> struct Is_Admitted<int> : public std::true_type{};
template<> struct Is_Admitted<double> : public std::true_type{};
int main()
{
std::cout << Is_Admitted<int, double>::value << '\n';
std::cout << Is_Admitted<int, char>::value << '\n';
}
- 编译并GCC下运行良好(> = 4.7,用C++ 11,C++ 14或C++ 17支持启用)
- 编译与一个警告,并用clang 3.6运行良好(与C++ 11,C++ 14或支持C++ 17支持)
- 确实不与以下错误VS2015RC(或预览)下编译:
(由我自己的错误描述翻译成英文,因为我无法设置英语编译语言,所以他们可能会与原有的不匹配)
error C2910: 'Is_Admitted<T,>': impossible to perform explicit specialization
error C2065: 'value': undeclared identifier
error C2976: 'Is_Admitted': insufficients template arguments
error C2131: constant expression does not return any value
哪个编译器是正确的,哪一个是错的?该代码是否符合C++ 11,C++ 14或C++ 17标准?
什么是正确的方法来做我想做的事情,那是一个可变类型的函数,只有当所有的模板类型参数都是一些被允许的类型时才返回true。
这是模板<>'是多余的 –
@DieterLücking噢,我的!我补充说,因为我很确定VS没有给我错误,但它不是真的。你说得对,谢谢。错误是cpp文件中的错字! –