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

C++ C++;带概念的别名模板(typedef)?,c++,typedef,using,c++-concepts,c++20,C++,Typedef,Using,C++ Concepts,C++20,gcc6:-F概念 模板 概念布尔字符串=需要(TS) { {s.clear()}->void; //等等。 }; 无效打印(常量字符串和消息); //无效打印(Str消息);//我想要Str=const字符串& 无效测试() { std::字符串str; 打印(str); } 有没有办法将Str声明为const字符串& 有没有办法将Str声明为const字符串& 不,而且,你也不想这样。概念是关于向类型添加约束的。因此,如果您希望约束打印以获取建模字符串的内容,您可以执行以下操作: temp

gcc6:-F概念

模板
概念布尔字符串=需要(TS)
{
{s.clear()}->void;
//等等。
};
无效打印(常量字符串和消息);
//无效打印(Str消息);//我想要Str=const字符串&
无效测试()
{
std::字符串str;
打印(str);
}
有没有办法将
Str
声明为
const字符串&

有没有办法将
Str
声明为
const字符串&

不,而且,你也不想这样。概念是关于向类型添加约束的。因此,如果您希望约束
打印
以获取建模
字符串的内容,您可以执行以下操作:

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
您可以通过转发引用获取
字符串

void print(String auto&&);
这些都是与“我想要一个
字符串
”方面不同的选项。你不能真的把它们组合在一起


你所能做的就是:

template <String T> using Str = T const&;
template <typename T> void print(Str<T>); // silently a const&
使用Str=T const的模板&;
模板无效打印(Str);//沉默的常数&

使用CR=T常量的模板&;
模板无效打印(CR);//沉默的常数&

这很有效。对于一些作品的定义。但是就像。。。不要那样做。一个函数取一个
常量&
而不是一个值,这一事实是非常重要的视觉信息,不要仅仅隐藏它

也许这是可能的,但我不建议把那样的东西藏起来。如果我看到一个类型为
Str
的参数,我会假设它创建了一个副本,而不是秘密地引用。这段代码只是一个例子。我想知道这是否可以实现,而不是这个特定的例子是否有意义,但是你没有得到扣除。这没有意义。它不允许按要求声明缩写模板“void print(Str message);”。这就是为什么我说你不能用这样的方法得到推论。在
const T&
上执行模式匹配需要模板推导。
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&