有没有办法强制自动推导考虑 operator <some_type>() 而不是复制赋值?
Is there a way to force auto deduction to consider operator <some_type>() over copy assignment?
我有一个变量包装器,当底层变量通过这个包装器被修改时,它会发出变化信号,这样其他对象就可以侦听变化。
它工作正常(即我可以在底层对象上分配、添加、减去、调用成员函数(尽管它们无法发出更改信号)等),但有一点小问题:如果我这样做
struct some_object_type
{
wrapper<int> some_wrapper;
}
int main()
{
some_object_type some_object;
auto value = some_object.some_wrapper;
}
value
这里被正确推导为 wrapper<int>
。有什么方法可以使此构造的行为就好像 some_object.some_wrapper
属于 int
类型,以便将 value
推导为 int
变量?
@TartanLlama 在他的评论中有正确的解决方案。但是,如果您指定 auto const& value = ...
,您希望 auto
推断出什么?在这种情况下,隐式转换将不起作用。
我以前 运行 遇到过这个问题,我能想到的最好的解决方案是提供一个 wrapper<T>::operator()
函数:
struct some_object_type
{
wrapper<int> some_wrapper;
}
int main()
{
some_object_type some_object;
auto value1 = some_object.some_wrapper; // deduces to wrapper<int>
auto value2 = some_object.some_wrapper(); //deduces to int
}
也许不是您所希望的解决方案,但除非您放弃自动类型推导,否则您最好的选择是@TartanLlama 的建议。
我有一个变量包装器,当底层变量通过这个包装器被修改时,它会发出变化信号,这样其他对象就可以侦听变化。
它工作正常(即我可以在底层对象上分配、添加、减去、调用成员函数(尽管它们无法发出更改信号)等),但有一点小问题:如果我这样做
struct some_object_type
{
wrapper<int> some_wrapper;
}
int main()
{
some_object_type some_object;
auto value = some_object.some_wrapper;
}
value
这里被正确推导为 wrapper<int>
。有什么方法可以使此构造的行为就好像 some_object.some_wrapper
属于 int
类型,以便将 value
推导为 int
变量?
@TartanLlama 在他的评论中有正确的解决方案。但是,如果您指定 auto const& value = ...
,您希望 auto
推断出什么?在这种情况下,隐式转换将不起作用。
我以前 运行 遇到过这个问题,我能想到的最好的解决方案是提供一个 wrapper<T>::operator()
函数:
struct some_object_type
{
wrapper<int> some_wrapper;
}
int main()
{
some_object_type some_object;
auto value1 = some_object.some_wrapper; // deduces to wrapper<int>
auto value2 = some_object.some_wrapper(); //deduces to int
}
也许不是您所希望的解决方案,但除非您放弃自动类型推导,否则您最好的选择是@TartanLlama 的建议。