基于相同模板的不同 类 的成员分配

Member by member assignment of different classes based on the same template

说一个有两个不同的class,但是在目的上有些“等价”,所以它们有相同的成员,一个可以被另一个赋值:

struct Pure
{
    QString name;
    int age = 18;
};

struct Observable
{
    QProperty<QString> name;
    QProperty<int> age {18};
    void operator=(const Pure& other)
    {
        name = other.name;
        age = other.age;
    }
};

QPropertytemplate class from Qt,但我认为这个问题与 Qt 无关,因为它适用于具有 conversion/assignment [= 的任何其他 template <typename T> class Foo 30=] T.

问题是如何避免重复,因此不能如此轻易地从一个 class 添加或删除成员而忘记在另一个上执行此操作,同时仍然保留分配一个对象的可能性class 给另一个。

我已经用模板尝试过几件事,这似乎是最有希望的:

// Adding two helpers only available in C++ 20 for convenience.
template<typename T>
struct type_identity { using type = T; };    
template<typename T>
using type_identity_t = typename type_identity<T>::type;

template<template<typename T> typename T>
struct State
{
    T<QString> name;
    T<int> age;

//    std::enable_if_t<std::is_same<QProperty<class X>, T>>
//    operator=(const State<type_identity_t>& other)
//    {
//        name = other.name;
//        age = other.age;
//    }
};

int main()
{
    State<type_identity_t> state;
    state.age = 42;
    State<QProperty> observableState;
    observableState = state; // Desired use. Fails to compile without operator=
}

注释掉的代码无法编译(错误:使用模板模板参数 'T' 需要模板参数),第一个注释行末尾的 T 处出现错误,但我不知道如何解决这个问题。

您不能使用 std::is_same<QProperty<class X>, T>,因为它试图将 T 作为第二个参数传递给 is_same,但它是一个模板并且 is_same 是期望的一种。

你可以创建一个类似 is_same 的特征,它采用模板 类 代替:

template<template<typename...> class A, template<typename...> class B>
struct is_same_template_class : std::false_type {};

template<template<typename...> class T>
struct is_same_template_class<T, T> : std::true_type {};

// use `is_same_template_class<T, QProperty>`

目前,似乎没有理由限制您的 operator= 可以做什么。为什么不是这样的:

template<template<typename> class T>
struct State
{
    T<QString> name;
    T<int> age;

    template<template<typename> class U>
    State& operator=(const State<U>& other)
    {
        name = other.name;
        age = other.age;
        return *this;
    }
};

而且我对 QT 不熟悉,但如果您重构一些逻辑,using Observable = QProperty<Pure>; 似乎也可以工作。