【发布时间】:2020-05-04 00:17:15
【问题描述】:
我正在尝试研究概念功能和语法,但我没有想出 std::vector 的工作示例,知道出了什么问题吗? https://gcc.godbolt.org/z/FHaQ-3
#include <vector>
#include <string>
template<typename T>
concept Compare = requires(T a, T b) {
{ a <=> b } -> std::same_as<std::partial_ordering>;
};
struct Cat {
int age;
std::string name;
auto operator<=>(const Cat&) const = default;
};
int main(int argc, char** argv) {
/* Single type: Fail
std::vector<Compare auto> vec{
Cat{4, "Faisca"},
Cat{4, "Neka"}
};
*/
/* Heterogenous: Fail
std::vector<Compare auto> vec{
Cat{4, "Faisca"}, 1, std::string{"Deu Ruim"}
};
*/
return 0;
}
【问题讨论】:
-
您是在问是否可以创建满足概念的异构类型的向量?
-
向量持有一种类型。您必须选择一种可以容纳任何这些值的单一类型。
-
是的,我的目标是拥有一个具有概念的异构类型的向量,或者一个单一类型的向量,我在这两种情况下都失败了。
-
第一个是不可能的。第二个应该是(即类型必须满足概念的向量),但编辑您的问题以显示您为此尝试过的内容。
-
如果你有时间投资,this video 会深入探讨实现这种类型擦除的技术。该链接指向一个时间戳,其内容与幻灯片上您的问题中的代码非常相似,但演讲的大部分内容都在讨论他的实际解决方案,最后一部分侧重于未来可能的语言更改,以启用更易于使用的库.
标签: c++ c++20 c++-concepts