如何为typedef定义隐式转换?

时间:2019-12-04 20:43:58

标签: c++ casting

我希望自动从std::string转换为我的类型my_type,定义为

typedef std::pair<std::string,int> my_type;

使得转换后的.first的{​​{1}}部分为字符串,而my_type部分始终为0。

如果有人用{p>

.second

我不想定义一个新的类而不是std::string fun(my_type x, ...) { return x.first; },如果可能的话,也不要重载我的所有函数。我想尽一切办法使用std::string s = "Hello"; fun(s, ...);,但无法编译程序。

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

my_type

现在自动拨打operator

1 个答案:

答案 0 :(得分:0)

无法为现有类(例如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的构造函数。