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

Standard way of shortening C++ function signatures

本文关键字:标准 方法 C++ 函数 缩短      更新时间:2023-10-16

当我有某些向量和模板化的包含对象时,模板总是变得非常长,而结尾看起来就像一堆> > > > > > >,有时很难分辨边界,比如:

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

有没有一种标准的方法来减少长度,或者使物品易于区分?我实际的代码是这个类声明。

我已经尝试过缩短函数名称并对返回值进行类型定义。

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;
};

有没有一种标准的方法来减少长度,或者使物品易于区分?

使用typedef键入别名可能很方便,例如:

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

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

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

更新

正如@Snowhawk04和@mkrieger1在评论中指出的那样,使用现代编译器,您不再需要>>之间的空间。只要确保使用正确的编译器标志,例如CCD_ 7与CCD_。请参阅有关>>和模板别名的更多信息。

作为一个额外的答案,在C++11中,您可以使用using而不是typedef,两者都可以实现相同的功能:

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

您还可以创建一个换行符,在返回类型之后换行。这就是Clang Format等格式化工具的作用。

struct EventMaker {
    virtual ~EventMaker() {};
    virtual std::vector<std::unique_ptr<Event>> 
    transfer_events() = 0;
};

C++11还引入了尾随返回类型。有些人发誓,除了它的预期用途之外,他们讨厌它。

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

不幸的是,我们不能在虚拟函数上使用C++14的自动返回类型推导,因为返回类型是它与派生类之间的契约的一部分。

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