是否可以通过允许在编译时提供任何成员的方式来找到这样的一对,从而在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要求每种类型只能写入一次,但是必须手动将所有对存储在模板参数列表中(不灵活)。
是否有可能以某种方式做到这一点配对定义可以彼此分开
对定义中是否不需要重复的代码?
当然,没有两个不同的对必须包含相同的类型,并且不必支持搜索不存在的对。
最佳答案
不确定您真正寻找的是什么,但这可能会有用:
#include <utility>
namespace pair {
template<class T> struct Type {};
template<class A, class B>
struct Pair {
Pair(Type<A>);
Pair(Type<B>);
using type = std::pair<A, B>;
};
} // pair
namespace detail {
void FindPairImpl(...);
template<class A>
auto FindPairImpl(pair::Type<A> a) -> typename decltype(RegisterPair(a))::type;
} // namespace detail
template<class PairedType>
using FindPair = decltype(detail::FindPairImpl(pair::Type<PairedType>()));
定制点:在
Pair<Type1, Type2> RegisterPair(Pair<Type1, Type2>)
命名空间中声明函数pair
。然后使用
FindPair
元函数查找类型的对:namespace pair { auto RegisterPair(Pair<double, const char *> a) -> decltype(a); }
int main() {
static_assert(std::is_same<FindPair<int>, void>::value);
static_assert(std::is_same<FindPair<double>, std::pair<double, const char *>>::value);
static_assert(std::is_same<FindPair<const char *>, std::pair<double, const char *>>::value);
}
关于c++ - 使用模板可以对类型(std::plus,std::minus)之类的对称关系建模吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/61560924/