考虑:
template <typename T>
struct C {
std::vector<int> f(const T &t) const {
return t.f();
}
};
T::f
必须计算所需的向量。然而,有些T
人预先计算了向量,我们希望避免在这种情况下创建副本。这是我的尝试:
struct A {
std::vector<int> f() const {
std::vector<int> res{10, 20, 30}; // computing the vector.
return res;
}
};
struct B {
const std::vector<int> &f() const {
return v_; // returning reference to pre-computed vector.
}
private:
std::vector<int> v_{1, 2, 3};
};
template <typename T>
struct C {
const std::vector<int> &f(const T &t) const {
return t.f();
}
};
int main() {
using T = B; // For A, we get an error about returning reference to a local.
C<T> c;
T t;
c.f(t);
return 0;
}
正如注释中main
指出的那样,对于T=A
,上面的代码是错误的,因为它返回了对局部变量的引用。我怎样才能同时容纳T=A
and T=B
,这样预先计算的向量B::v_
就不会被复制?