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&
?
答案 0 :(得分:2)
是否可以将
Str
声明为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);
您可以通过转发参考来获取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&
而不是值的事实是非常重要的视觉信息,而不仅仅是隐藏它。