Но здесь я просто проверяю, могу ли я преобразовывать, а не определен оператор преобразования.
Так почему бы вам не проверить существование оператора?
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, "!" );
}