先日、私はこの問題に遭遇しました。MSVC - void_tでのメンバー検出が正しく動作しません。
#include <iostream>
#include <type_traits>
using namespace std;
template<typename... Ts> struct make_void { typedef void type; };
template<typename... Ts> using void_t = typename make_void<Ts...>::type;
template <class, class = void>
struct is_func_chrend_ : std::false_type {};
template <class T>
struct is_func_chrend_<T, ::void_t<decltype(std::declval<T>().NextTile())>> : std::true_type {};
template <class = void, class = void>
struct is_addable : std::false_type {};
template <class T>
struct is_addable<T, ::void_t<decltype(std::declval<T>() + std::declval<T>())>> : std::true_type {};
int main() {
cout << is_addable<int>::value << endl;
return 0;
}
MSVCでコンパイルすると0、clangまたはgccでコンパイルされている場合は1を表示します。 is_func_chrend_
を完全に削除すると、is_addable
が正常に動作します。
Makeshift void_t
は、C++ 11準拠のコンパイラでのみ使用されます。
あなたのコードは調査されていませんが、VSは完全に式を実装していません。SFINAE – bolov
これを試してみてくださいhttp://stackoverflow.com/q/35669239/3953764 –
これは動作するためにはおそらく最新のMSVCが必要です。私はVS2015 SP3で '1'を取得します。 –