【问题标题】:using/typedef of namespace in header标题中命名空间的 using/typedef
【发布时间】:2017-05-18 21:07:00
【问题描述】:

我在测试应用程序中有一个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 关键字的性质。更多的是学习体验,而不是现实世界的应用主张。

干杯

【问题讨论】:

  • 你可以做一个命名空间别名(std::placeholder 是一个命名空间,而不是一个类型),但它必须在命名空间或函数范围内:namespace RequestResultHandle = std::placeholder
  • “不行”不是可接受的问题陈述。
  • 这与std::placeholders(或std::placeholder,不存在)无关,如果您玩过并发现这个问题是关于您如何使用命名空间别名(不能在类范围内)。
  • 啊,是的。 std::placeholders 是我的意思:)谢谢你们。

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


【解决方案1】:

如果你想在 header 级别使用它,那么引入命名空间别名很简单:

namespace RequestResultHandle = std::placeholders;

然而,以上内容在课堂内不会被接受。

【讨论】:

  • 没有std::placeholder这样的东西。
  • @BoundaryImposition - 哎呀,可惜我打错了's',你为什么不呢
  • 这实际上是现在最好的答案^_^
【解决方案2】:

努力让 API 方面看起来更简洁

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

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

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

【讨论】:

  • 正确。是的,API 级别可能不是最好的。它应该在群组之间进行更多的内部工作。感谢您的输入!我只是希望结果,基于模型 setData 函数的不同意志,可以使用“漂亮”字,而不是在任何我们需要应用 bind 的地方使用 std::placeholders
【解决方案3】:

您不能使用using 指令为namespace 设置别名。

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

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

    ...
}

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

【讨论】:

  • “你不能使用 using 指令来给命名空间取别名。” 不可以,但只需稍加调整(比如 namespace 而不是 unionyou can do just that ,而无需依次命名每个命名空间成员。
  • @BoundaryImposition,你刚才说的是union而不是using吗?你正在失去你的触摸:)
  • 来晚了哈哈 :D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多