Понял, что работает (спасибо моему коллеге NB):
#include <string>
#include <iostream>
class MyClass {
int m_int;
double m_double;
std::string m_string;
public:
MyClass() : m_int{1}, m_double(1.2), m_string{"Test"} {};
// overload the conversion operator for std::string
operator std::string() {
return m_string;
}
// overload the conversion operator for all other types
template <typename T, typename std::enable_if<
std::is_same<T, int>::value ||
std::is_same<T, double>::value
,T>::type* = nullptr>
operator T() {
if (std::is_same<T, int>::value)
return m_int;
else
return m_double;
}
};
int main() {
MyClass o;
int i = o;
double d = o;
std::string s;
s = o;
std::cout << i << " " << " " << d << " " << s << std::endl;
}
Так что нужно включить шаблон для всех допустимых типов. Но как только (char) находится в списке типов в std :: enable_if <>, ошибка возникает снова. Очевидно, что оператор std :: string = хочет отобразить на char
(см. Пункт 4. выше).
Что я сейчас не понимаю, так это то, почему явно указываются операторы преобразования int () и double () явно НЕ работает:
operator int() {
return m_int;
}
operator double() {
return m_double;
}
, хотя это должно быть эквивалентно
template <typename T, typename std::enable_if<
std::is_same<T, int>::value ||
std::is_same<T, double>::value
,T>::type* = nullptr>
operator T() {
if (std::is_same<T, int>::value)
return m_int;
else
return m_double;
}
Также не ясно, почему это не работает:
template <typename T, typename std::enable_if<
std::is_same<T, int>::value ||
std::is_same<T, double>::value ||
std::is_same<T, std::string>::value
,T>::type* = nullptr>
operator T() {
if (std::is_same<T, std::string>::value)
return m_string;
else if (std::is_same<T, int>::value)
return m_int;
else
return m_double;
}
Может быть, кто-то может дать мне некоторое представление.