【发布时间】:2020-08-17 00:45:20
【问题描述】:
是否可以在 c++(20) 中定义(无序的)类型对,以允许通过在编译时提供其任何成员来找到这样的对?
这很容易通过手动为每个无序对定义两个有序对或通过在一个位置定义完整的对集合来实现,例如作为元组的模板参数:
通过特化定义对 (A,B):
template<>
struct find_pair<A> {
using p = std::pair<A,B>;
};
template<>
struct find_pair<B> {
using p = std::pair<A,B>;
};
获取(A,B):
find_pair<A>::p
或
find_pair<B>::p
通过可变参数模板定义完整的对集:
template<typename A, typename B, typename ... X>
struct some_binary_relation : some_binary_relation<X...> {
template<>
static std::pair<A,B> p<A>();
template<>
static std::pair<A,B> p<B>();
};
using rel1 = some_relation<A,B,F,G,M,N>;
decltype(rel1::p<G>()) x //std::pair<F,G>
方法#1 的优点是对的每个定义都可以分开,但需要冗余/臃肿的语法。 方法 #2 要求每种类型只编写一次,但必须手动收集模板参数列表中的所有对(不灵活)。
有没有可能以某种方式做到这一点?对定义可以彼此分开 并且一对定义中不需要重复代码?
当然,没有两个不同的对必须包含相同的类型,并且不必支持搜索不存在的对。
【问题讨论】:
标签: c++ templates template-meta-programming