C++中正确的typedef位置

Zac*_*Lee 6 c++ typedef

我想问一下C++中typedef的正确位置.

Version1:类外的typedef

typedef std::pair<std::string, int> StrIntPair;
typedef std::vector<StrIntPair> StrIntPairVec;

class MyData
{
public:
    MyData(){};
    ~MyData(){};
private:
    void addInfo(const StrIntPair &info)
    {
        infoVec.push_back(info);
    }
    StrIntPair info;
    StrIntPairVec infoVec;
};
Run Code Online (Sandbox Code Playgroud)

Version2:类public中的typedef

class MyData
{
public:
    MyData(){};
    ~MyData(){};
    typedef std::pair<std::string, int> StrIntPair;
    typedef std::vector<StrIntPair> StrIntPairVec;
private:
    void addInfo(const StrIntPair &info)
    {
        infoVec.push_back(info);
    }
    StrIntPair info;
    StrIntPairVec infoVec;
};
Run Code Online (Sandbox Code Playgroud)

版本3:类私有中的typedef

class MyData
{
public:
    MyData(){};
    ~MyData(){};
private:
    typedef std::pair<std::string, int> StrIntPair;
    typedef std::vector<StrIntPair> StrIntPairVec;
    void addInfo(const StrIntPair &info)
    {
        infoVec.push_back(info);
    }
    StrIntPair info;
    StrIntPairVec infoVec;
};
Run Code Online (Sandbox Code Playgroud)

哪个版本是最佳做法?

lub*_*bgr 12

这取决于您使用类型别名的位置.我建议你

  • 如果在类和/或函数之间使用它们,则将它们放在类之外,并且别名的含义并不仅仅与类有关.
  • 如果类外部的客户端代码需要访问它们(例如,初始化对象或存储成员函数的别名返回值),则将它们定义为公共类类型别名,但别名与类相关.别名然后成为类接口的一部分.
  • 当您在类中专门使用它们时,将它们定义为私有类类型别名,例如,一些实用程序数据结构,在将其传递给成员函数时一直输入很烦人.

编译器只会强制太窄的别名范围(例如,您使用在该类之外的类的私有部分中定义的类型别名),如果您选择不必要的许可范围,则不会抱怨(例如,您公开声明别名,但仅在类实现中使用它).因此,努力选择尽可能最窄的范围,这与隐藏实现细节一致.

作为旁注,您可能需要考虑声明类型别名using StrIntPair = std::pair<std::string, int>;,请参阅Effective Modern C++中的第9项.不过,这对上述情况没有影响.

  • @sepctras也可以反过来说,例如,如果你在代码中使用`std :: vector <??> :: value_type`而不是`??`那么实际的类型可以改变,而不需要改变单行码 (2认同)