EDIT: после комментария Майка Сеймура я заменил operator std::string () const;
на operator char * () const;
и соответствующим образом изменил реализацию. Это позволяет использовать неявное кастинг, но по какой-либо причине оператор unsigned long int имеет приоритет над оператором char *, который просто не чувствует себя хорошо... Кроме того, я не хочу показывать неприятный материал C, например char * вне класса, когда у меня есть std::string. У меня есть догадка, что мой класс CustomizedInt должен наследовать от некоторых вещей, чтобы поддержать функцию, которую я желаю. Может ли кто-нибудь прокомментировать комментарий Майка относительно std::basic_string
? Я не уверен, что правильно понял.
У меня есть эта часть кода:
#include <string>
#include <sstream>
#include <iostream>
class CustomizedInt
{
private:
int data;
public:
CustomizedInt() : data(123)
{
}
operator unsigned long int () const;
operator std::string () const;
};
CustomizedInt::operator unsigned long int () const
{
std::cout << "Called operator unsigned long int; ";
unsigned long int output;
output = (unsigned long int)data;
return output;
}
CustomizedInt::operator std::string () const
{
std::cout << "Called operator std::string; ";
std::stringstream ss;
ss << this->data;
return ss.str();
}
int main()
{
CustomizedInt x;
std::cout << x << std::endl;
return 0;
}
Какие печатает "Вызывается оператор unsigned long int; 123". Мои вопросы таковы:
- После того, как я удалю оператор unsigned long int, зачем мне явно указывать x на std::string? Почему он не вызывает неявный оператор литья (std::string) напрямую?
- Есть ли какая-либо документация, объясняющая, какие неявные броски разрешены и каков их порядок приоритета? Кажется, что если я добавлю оператор unsigned int в этот класс вместе с оператором unsigned long int, я получаю ошибку компилятора о неоднозначности для < оператор...
- Кроме того, я знаю, что определение такого оператора может быть плохой практикой, но я не уверен, что полностью понимаю связанные с этим оговорки. Может кто-нибудь, пожалуйста, изложить их? Лучше ли было бы просто определять общедоступные методы ToUnsignedLongInt и ToString?