在标题

时间:2017-05-18 21:07:00

标签: c++ c++11 namespaces typedef using

我在测试应用程序中有std::placeholder的用例,但我想知道,为了使API方面看起来更清洁,是否有办法弯曲usingtypedef甚至#define在标题级别为命名空间设置别名。

// .../datarequestprocessor.h
class DataRequestProcessor {
public:
    using ProcessFunction = std::function<void(const ResultData &)>;
    using RequestResultHandle = std::placeholders; // No go. Same with ::_1
    ...
};

// ../datarequestprocessor.cpp
ProcessFunction DataRequestProcessor::prepOne()
{
    auto func = std::bind( &DataModel::setData,
                           m_model,
                           RequestResultHandle::_1 );
    return func;
}
... // For other variations.

这纯粹是语义上的,也只是努力了解using关键字的性质。更多的学习经验,然后是现实世界的应用程序主张。

干杯

3 个答案:

答案 0 :(得分:2)

  

努力使API方面看起来更清洁

理想情况下,您根本不应在API中公开占位符。如果您这样做,则表示您尚未在上面的代码中显示它。

如果您只是在实现中使用占位符,则以下操作将起到作用:

ProcessFunction DataRequestProcessor::prepOne()
{
    using namespace std::placeholders;
    auto func = std::bind( &DataModel::setData,
                           m_model,
                           _1 );
    return func;
}

答案 1 :(得分:2)

如果您希望它在标题级别,那么引入命名空间别名就是一个简单的问题:

namespace RequestResultHandle = std::placeholders;

然而,上面的内容不会被接受。

答案 2 :(得分:0)

您无法使用using指令为namespace添加别名。

如果您有动力,可以定义自己的namespace,其中您可以在其中命名来自其他命名空间的特定类型。

namespace RequestResultHandle
{
    using _1 = std::placeholders::_1;
    using _2 = std::placeholders::_2;

    ...
}

现在,您可以使用RequestResultHandle::_1代替std::placeholders::_1