【发布时间】:2021-08-22 22:46:48
【问题描述】:
问题
这是我面临的一个问题的人为示例。我有一个带有 map 函数的模板化对象,该函数创建一个新对象并对该新对象内的私有(或受保护,无关紧要)成员进行操作。
template<typename T>
class Foo {
public:
template<typename R>
Foo<R> map(std::function<R(std::optional<T>)> &&function) {
auto mappedValue = function(mValue);
Foo<R> f{};
f.mValue = mappedValue;
}
private:
std::optional<T> mValue;
};
只要T 和R 相同,它就可以正常工作。例如:
int main()
{
Foo<int> f1{};
Foo<int> f2 = f1.map<int>([](std::optional<int> value) {
if (value.has_value()) {
return value.value() + 1;
}
else {
return 1;
}
});
return 0;
}
但是,当我T != R 时,我遇到了问题:
int main()
{
Foo<int> f1{};
Foo<double> f2 = f1.map<double>([](std::optional<int> value) {
if (value.has_value()) {
return value.value() + 1.0;
}
else {
return 1.0;
}
});
return 0;
}
main.cpp:22:11: error: ‘std::optional Foo::mValue’ is private within this context
f.mValue = mappedValue;
~~^~~~~~
main.cpp:26:22: note: declared private here
std::optional<T> mValue;
^~~~~~
问题
这很容易理解。 C++ 访问控制在每个类的基础上工作,Foo<int> 与Foo<double> 不是同一个类。我什至可以通过添加:friend class Foo<int> 来解决问题。这不能很好地扩展,因为我不知道 T 和 R 可能是什么。
有谁知道处理这个问题的通用方法并让Foo<int> 访问Foo<double> 的私有/受保护成员?
【问题讨论】:
-
我认为您正在循环播放的是:stackoverflow.com/questions/3292795/… 对吗?
标签: c++ templates access-control