调用对象时C ++返回对象成员变量?
Posted
技术标签:
【中文标题】调用对象时C ++返回对象成员变量?【英文标题】:C++ return object member variable when object is called? 【发布时间】:2020-08-27 12:58:56 【问题描述】:如何让一个类在被调用时返回一个成员变量?说:
class Person
std::string name;
// Constructor and Destructor go here..
;
Person mike = "Mike";
// /!\ How do you make "mike" return "Mike" directly when the object mike is called?
// This is the same thing like an int return its value and a vector returns its members (scalars)
std::string name = mike;
附加编辑:强制转换运算符在这里不是一个好选择,因为它破坏了类型的编写方式。例如std::string name = static_cast<string>(mike);
是实现我的目标的可怕方式。
【问题讨论】:
听起来您正在寻找"cast operator"? @0x5453 Python中没有类似“repr”的东西吗?我不是 Python 方面的专家,但我认为这种方法实现了我正在尝试做的事情。 Python 和 C++ 是两种不同的语言。 C++ 有自己的一套范式、习语和规则。 @xxdraxulis 你总是可以重载to_string(const Person&)
或operator<<(std::ostream&, const Person&)
,但它们的行为与Python 的__repr__
不太一样。
考虑隐式转换的代价是(不那么明显)。突然之间,在需要 std::string
的情况下,使用 Person
不会出现编译器错误。转换是有意的还是逻辑错误?现在由你决定,编译器不再提供帮助
【参考方案1】:
你正在寻找一个转换运算符,它是这样写的:
class Person
std::string name;
public:
Person(char const * name) : name(name)
operator std::string () const return name;
;
这是demo。
您也可以将转换运算符设为模板,如下所示:
template<typename T>
operator T() const return name;
这是demo。
【讨论】:
如果它不需要static_cast<>();
运算符,那么这回答了我的问题。现在您知道如何将其作为模板工作了吗?我的类是模板,所以我不想为每种类型显式地实现这个函数。谢谢。
@xxdraxulis 当然,您可以将其模板化,添加到答案中。
不相关,但请注意,如果 name
是 nullptr
,则 Person(char const * name) : name(name)
是 UB。为什么std::string
在那种情况下不会构造为空,这超出了我的理解。
Person(char const * name) : name(name?name:"")
以上是关于调用对象时C ++返回对象成员变量?的主要内容,如果未能解决你的问题,请参考以下文章