【问题标题】:C++ alias template (typedef) with concepts?带有概念的 C++ 别名模板(typedef)?
【发布时间】:2016-10-26 10:48:48
【问题描述】:

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4553.pdf

gcc6: -fconcepts

template<typename T>
concept bool String = requires(T s)
{
    { s.clear() } -> void;
    // etc.
};

void print(const String& message);
//void print(Str message); // I want Str = const String&

void test()
{
  std::string str;
  print(str);
}

有没有办法将Str 声明为const String&amp;

【问题讨论】:

  • 也许有可能,但我不建议隐藏这样的内容。如果我看到一个类型为Str 的参数,我会假设它创建了一个副本,而不是偷偷地获取一个引用。
  • 这段代码只是一个例子。我想知道它是否可以完成,而不是这个特定的例子是否有意义。
  • 你可以做类似template &lt;String T&gt; using Str = const T&amp;;的事情,但是你没有得到扣除。
  • 这毫无意义。不允许声明缩写模板“void print(Str message);”根据要求。
  • 这就是为什么我说你用这样的方法得不到扣除。 const T&amp;上进行模式匹配需要模板推演。

标签: c++ typedef using c++-concepts c++20


【解决方案1】:

有没有办法将Str 声明为const String&amp;

没有。而且,无论如何,您都不希望那样。概念是关于向类型添加约束。因此,如果您想约束 print 采用模拟 String 的东西,您可以这样做:

template <typename T> requires String<T> void print(T const&); // requires-clause
template <String T> void print(T const&); // partial-concept-id
void print(String auto const&); // probably what C++20 will allow

但是约束和值类别是正交的。您可以按值取 String

void print(String auto);

您可以通过转发参考来获取String

void print(String auto&&);

这些都是与“我想要String”方面不同的选项。你不能真正将它们组合在一起。


你能做的最好的就是:

template <String T> using Str = T const&;
template <typename T> void print(Str<T>); // silently a const&

template <typename T> using CR = T const&;
template <String T> void print(CR<T>); // silently a const&

这行得通。对于作品的一些定义。但就像......不要那样做。函数采用 const&amp; 而不是值这一事实是非常重要的视觉信息,不要只是隐藏它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-02
    • 1970-01-01
    • 1970-01-01
    • 2013-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多