header 中的 using/typedef 个命名空间

using/typedef of namespace in header

我在测试应用程序中有一个 std::placeholder 的用例,但我想知道,为了使 API 方面的事情看起来更清晰,是否有一种方法可以将 usingtypedef 甚至 #define 弯曲为 header 级别的命名空间别名。

// .../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 关键字的性质。更多的是学习经验,然后是现实世界的应用命题。

干杯

in an effort to make things look a little cleaner on an API side

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

如果您只是在实现中使用占位符,以下方法可以解决问题:

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

如果你想在header级别,那么引入命名空间别名是一件简单的事情:

namespace RequestResultHandle = std::placeholders;

但是 class 不会接受以上内容。

您不能使用 using 指令为 namespace 添加别名。

如果你有动力,你可以定义你自己的 namespace,你可以在其中为来自另一个命名空间的特定类型起别名。

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

    ...
}

现在,您可以使用 RequestResultHandle::_1 而不是 std::placeholders::_1