缩短 C++ 函数签名的标准方法

Standard way of shortening C++ function signatures

当我有特定的向量和模板化包含的对象时,模板总是变得很长,最后看起来就像一堆 > > > > > > > 有时很难辨别边界,像这样:

std::vector< std::pair< std::string, std::set< std::string > > >

是否有减少长度或使项目易于区分的标准方法?我的实际代码是这个 class 声明。

我已经尝试缩短函数名称并键入定义 return 值。

class Event_Maker
{
    public:

        virtual ~Event_Maker() {};

        // this one                                    *this juts out really far   v
        virtual std::vector< std::unique_ptr< Event > > transfer_events( void ) = 0;
};

Is there a standard way to reduce the length, or to make the items easily distinguishable?

使用 typedef 的类型别名会很方便,例如:

typedef std::unique_ptr<Event> EventPtr;
typedef std::vector<EventPtr> EventVector;
virtual EventVector transfer_events( void ) = 0;

顺便说一句,你只需要 >> 之间的 space,你不需要在 < 之后或 >:

之前
std::vector<std::pair<std::string, std::set<std::string> > >

更新

正如 @Snowhawk04 and @mkrieger1 在评论中指出的那样, 使用现代编译器,您不再需要 >> 之间的 space 。 只要确保使用正确的编译器标志, 例如 -std=c++0xg++。 查看更多信息 about >> and template aliases

您也可以只创建一个在 return 类型之后换行的新行。这就是像 Clang-Format 这样的格式化工具所做的。

struct EventMaker {
    virtual ~EventMaker() {};

    virtual std::vector<std::unique_ptr<Event>> 
    transfer_events() = 0;
};

C++11 还引入了 Trailing-Return-Type。有些人发誓在其预期用途之外讨厌它。

struct EventMaker {
    virtual ~EventMaker() {};

    virtual auto transfer_events() 
    -> std::vector<std::unique_ptr<Event>> = 0;
};

不幸的是,我们不能在虚函数上使用 C++14 的 Auto Return 类型推导 ,因为 return 类型是它具有的契约的一部分推导 类.

除非您打算编写多语言代码(即 extern "C"{};),否则您可以在不带参数的函数上省略 void 参数,.

作为附加答案,在 C++11 中你可以使用 using 而不是 typedef,两者完成同样的事情:

//typedef pair<string, set<string>> pairStrSetStr;
using pairStrSetStr = pair<string, set<string>>;
vector<pairStrSetStr> vec;