c ++ 14级联模板实例化

时间:2018-02-05 21:24:45

标签: templates c++14 metaprogramming

我有一些代码:

#include <iostream>
#include <type_traits>

template <bool Approved>
struct concept_model {};

template <typename Impl>
struct endpoint_model {
  struct has_method_Impl_foo { 
  private: 
    template<typename T> 
    static constexpr auto check(T*) -> typename 
      std::is_same< 
        decltype(std::declval<T>().foo(std::declval<int>())), 
        void 
      >::type; 

     template<typename>
     static constexpr std::false_type check(...); 

  public: 
    using type = decltype(check<Impl>(0)); 
    static constexpr bool value = type::value; 
  }; 

  static constexpr bool concept_approved = has_method_Impl_foo::value;
  //using model = concept_model<endpoint_model::concept_approved>; // 1
};

struct test_endpoint : public endpoint_model<test_endpoint> {
  void foo(int);
};

int main(int argc, char* argv[]) {
  constexpr bool approved = test_endpoint::concept_approved;
  std::cout << std::boolalpha << approved << std::endl;
  return 0; 
}

如果第1行被评论endpoint_model::concept_approved等于true,则等于false。它已在最新版本的gcc / msvc / icc / clang(wandbox)上进行了检查。结构endpoint_model是标准的CRTP,它可以在任何地方使用。 我不明白为什么会这样运作?

0 个答案:

没有答案