基于相同模板的不同 类 的成员分配
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;
}
};
QProperty
是 template 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>;
似乎也可以工作。
说一个有两个不同的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;
}
};
QProperty
是 template 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>;
似乎也可以工作。