Я пытаюсь реализовать хак, где я пытаюсь перегрузить return. Я позволю коду поговорить.C++ Перегрузка оператора преобразования hack
namespace tcn
{
class foo
{
std::string blah;
public:
class proxy
{
int intval;
std::string strval;
public:
proxy(int intv, std::string strv) : intval(intv), strval(strv) {};
operator int() const { return intval; }
operator std::string() const { return strval; }
};
foo();
~foo();
proxy get();
};
foo::foo()
{
// Create stuff //
}
foo::~foo()
{
// Destroy stuff //
}
foo::proxy foo::get()
{
int intval = 911;
std::string strval = "Hello!?";
proxy temp(intval, strval);
return temp;
}
}
int main()
{
tcn::foo bar;
std::string ts = bar.get(); // OK
int ti = bar.get(); // OK
ti = bar.get(); // OK
ts = bar.get(); // Compile error here
return 0;
}
Если я пытаюсь скомпилировать код, он выдает ошибку, как следующий
error: ambiguous overload for 'operator=' (operand types are 'std::string {aka std::basic_string}' and 'tcn::foo::proxy')
ts = bar.get();
мне было интересно, как это преодолеть. Я видел другие способы реализовать это, используя «подсказки», но я пытаюсь дать пользователю легкий интерфейс. Поэтому я ищу простое назначение со стороны пользователя. Как еще это можно реализовать?
Благодарим вас за это, и если это будет выглядеть, прошу прощения. Я не так хорош в C++.
Вместо предоставления неявных преобразований просто имеют геттеры (и сеттеры) с разными именами для разных типов. Это разумно, так как в большинстве случаев программист, записывающий вызывающую функцию, будет знать, что является требуемым типом, и иметь возможность выбирать требуемый getter/setter по имени. – Peter
Примечание: только ошибки на GCC (возможно, и Clang), а не на MSVC (неожиданное удивление). –
OP, явное приведение в действие, однако, компилятор не может различать. 'ts = static_cast (bar.get());' –