检测转换运算符的实现

时间:2018-07-04 11:31:51

标签: c++ c++11 templates sfinae

我想检测某个类是否为特定类型(例如

)实现了转化运算符
No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.

我实现了以下结构,可以用来检测该结构并用于选择要使用的模板函数。

struct Foo
{
    operator std::map<std::string, std::string> () { ... }
}

但是,这里我只是检查我可以转换,而不是定义了转换运算符。有更好的方法吗?

1 个答案:

答案 0 :(得分:4)

  

但是,这里我只是检查我可以转换,而不是定义了转换运算符。

那为什么不检查运算符的存在性呢?

  template <typename U>
  static auto check (U * t)
     -> decltype( t->operator D(), std::true_type{} );

非主题建议:代替

   static constexpr bool value 
      = std::is_same<decltype(check<T>(nullptr)), std::true_type>::value;

您可以简单地写

   static constexpr bool value = decltype(check<T>(nullptr))::value;

以下是完整的编译示例

#include <map>
#include <string>

struct Foo
 { operator std::map<std::string, std::string> () { return {}; } };

template <typename T, typename D>
struct can_convert_to
 {
   private:
      template <typename U>
      static auto check (U * t)
         -> decltype( t->operator D(), std::true_type{} );

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

   public:
      static constexpr bool value = decltype(check<T>(nullptr))::value;
 };

int main ()
 {
   using mss = std::map<std::string, std::string>;

   static_assert( false == can_convert_to<Foo, int>::value, "!" );
   static_assert(  true == can_convert_to<Foo, mss>::value, "!" );
 }