Определить реализацию оператора преобразования - PullRequest
0 голосов
/ 04 июля 2018

Я хочу определить, реализует ли класс оператор преобразования для определенного типа, например,

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

Я реализовал следующую структуру, которую я могу использовать, чтобы обнаружить это и использовать для выбора шаблонных функций, которые будут использоваться.

template<class T, class D>
struct can_convert_to
{
private:
    template<typename U> static auto check(U* t) -> decltype( static_cast<D>(*t), std::true_type());
    template<typename U> static std::false_type check(...);
public:
    static constexpr bool value = std::is_same<decltype(check<T>(nullptr)), std::true_type>::value;
};

Но здесь я просто проверяю, могу ли я преобразовывать, а не определен оператор преобразования. Есть ли лучший способ сделать это?

1 Ответ

0 голосов
/ 04 июля 2018

Но здесь я просто проверяю, могу ли я преобразовывать, а не определен оператор преобразования.

Так почему бы вам не проверить существование оператора?

  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, "!" );
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...