gpt4 book ai didi

c++ - 如何为typedef定义隐式转换?

转载 作者:行者123 更新时间:2023-12-01 14:58:25 39 4
gpt4 key购买 nike

我想将std::string自动转换为我的my_type类型,定义为
typedef std::pair<std::string,int> my_type;
这样,转换后的.firstmy_type部分为字符串,而.second部分始终为0。

如果有人使用以下命令调用std::string fun(my_type x, ...) { return x.first; }函数,它也应该起作用:
std::string s = "Hello"; fun(s, ...);

我不想定义一个新的类而不是my_type,如果可能的话,也不要重载我的所有函数。我试图把头放在如何使用operator上,但是我无法编译我的程序。

编辑:
由于没有定义自定义结构似乎无法实现,因此,我想出了一种解决方法,但我希望无需定义新的类/结构就可以实现。不过,感谢您为我节省了更多时间来尝试执行此操作。

class Element {
public:
Element() {};
Element(std::string s, int a) { name = s; value = a; };
Element(std::string s) { name = s; value = 0; };
...
std::string return_name() { return name; };
private:
std::string name;
int value;
};

std::string fun(Element x) { return x.return_name(); };

调用 std::string s = "Hello"; fun(s);现在可以自动工作。

最佳答案

无法为现有类添加新的隐式转换,例如std::pair。隐式转换只能是成员函数:

  • 一个非显式的构造函数,可以使用一个参数来调用。如果有更多参数,则它们必须具有默认值。
  • operator T() const转换运算符。

  • 而且,不更改类定义就不可能向类添加新的成员函数。设置此限制是为了防止在全局或命名空间范围内引入的函数更改现有代码的语义。

    您可以做的是使用转换构造函数(可以使用一个参数调用的非显式构造函数)创建一个新类:
    struct MyPair : std::pair<std::string, int> {
    // In this class scope pair now refers to std::pair<std::string, int>.

    MyPair(std::string const& a)
    : pair(a, 0)
    {}

    MyPair(pair const& a)
    : pair(a)
    {}
    };


    std::pair<std::string, int>派生可以在期望 MyPair的地方传递 std::pair<std::string, int>。另一个将 std::pair<std::string, int>转换为 MyPair的构造函数。

    关于c++ - 如何为typedef定义隐式转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59184426/

    39 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com