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文件中的錯字! –