带有概念的C别名模板(typedef)?

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&?

最佳答案

Is there any way to declare Str as const String&?

不,而且,无论如何,你不需要这样.概念是关于向类型添加约束.因此,如果您想约束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);

你可以通过转发参考来获取一个字符串:

void print(String auto&&);

这些都是“我想要一个字符串”方面的单独选项.你不能真正将这些组合在一起.

你能做的最好的是:

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&相对于一个值是非常重要的视觉信息,不要只是隐藏它.

点赞