gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:08:02 25 4
gpt4 key购买 nike

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

gcc6: -f 概念

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);

你可以通过转发引用获取一个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& 而不是值这一事实是非常重要的视觉信息,不要只是隐藏它。

关于带有概念的 C++ 别名模板(typedef)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40260287/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com