Прежде всего, согласно документации set_intersection использует оператор <.И, во-вторых, вы можете создать третью структуру, которая будет извлекать из типа поля, которые вы будете использовать для сравнения </p>
std::set<X1> l_set1;
std::set<X2> l_set2;
struct XCompare
{
int value;
XCompare(const X1& x)
{
value = x.value;
}
XCompare(const X2& x)
{
value = x.value;
}
}
std::set_intersection(...,...,[](const XCompare& c1, const XCompare& c2){
... } )
Вы можете пойти по этому пути и создать пользовательскую оболочку, которая может делать все что угодно, кроме двух типовМожно сравнить
template<typename T1, typename T2>
struct ValueWrapper
{
T1 const* v1 = nullptr;
T2 const* v2 = nullptr;
ValueWrapper(const T1& value)
{
v1 = &value;
}
ValueWrapper(const T2& value)
{
v2 = &value;
}
bool operator<(const ValueWrapper& other)
{
if (v1 != nullptr)
{
if (other.v1 != nullptr)
{
return *v1 < *(other.v2)
}
...}}
template<typename T1, typename T2>
struct ValueWrapperComparator
{
bool operator()(ValueWrapper<T1,T2> v1, ValueWrapper<T1,T2> v2)
{
return v1 < v2;
}
}
Что-то в этом роде.Я не проверял его, и он не скомпилируется, но вы поняли.Может быть, что-то похожее скрыто в чем-то похожем где-то в библиотеках STL
Редактировать: Кстати, я думаю, что вы можете использовать какой-то тип варианта (Boost :: Вариант или STD :: Вариант) Я думаю, что это уже делает это ...