C++ 允许预先计算和实时计算结果
考虑:C++ 允许预先计算和实时计算结果,c++,c++11,generic-programming,const-reference,C++,C++11,Generic Programming,Const Reference,考虑: template <typename T> struct C { std::vector<int> f(const T &t) const { return t.f(); } }; 正如main中的注释所示,对于T=A,上述代码在返回对局部变量的引用时出错。我如何适应T=A和T=B,从而使预先计算的向量B::v_不会被复制 MakeC::f使用decltype返回与T::f完全相同的类型: template <typ
template <typename T>
struct C {
std::vector<int> f(const T &t) const {
return t.f();
}
};
正如
main
中的注释所示,对于T=A
,上述代码在返回对局部变量的引用时出错。我如何适应T=A
和T=B
,从而使预先计算的向量B::v_
不会被复制 MakeC::f
使用decltype
返回与T::f
完全相同的类型:
template <typename T>
struct C {
auto f(const T &t) const -> decltype(t.f()) {
return t.f();
}
};
模板
结构C{
自动f(常数T&T)常数->数据类型(T.f()){
返回t.f();
}
};
当T=A
时,它将按值返回,当T=B
时,它将按常量返回
您的尝试没有测试它应该做什么。为了使预先计算的结果有用,它们需要是持久的。一个类需要同时进行计算和存储 比如说,
struct A {
std::vector<int> const & f() const {
if ( v_.empty() ) {
v_ = {10, 20, 30}; // computing the vector.
}
return v_;
}
private:
mutable std::vector<int> v_;
};
结构A{
std::vector const&f()const{
if(v_u.empty()){
v_u={10,20,30};//计算向量。
}
返回v_;
}
私人:
可变std::向量v_;
};
另一种体系结构是将所有结果存储在一个
std::map
(或无序的\u map
)中,如果有某种类型的X
定义函数的域。您的代码已编译并工作:@Zefick它似乎只工作,但正如OP正确指出的,它返回对局部变量UB的引用。为什么不能将计算向量存储在类a中?您可以同时解决复制和语法问题。使用decltype(auto)
作为返回type@BlackMoses在实际代码中,A::f
根据对象的状态计算向量。在这种实际情况下,将A::f
每次调用的结果存储在一个成员变量中会很糟糕。
struct A {
std::vector<int> const & f() const {
if ( v_.empty() ) {
v_ = {10, 20, 30}; // computing the vector.
}
return v_;
}
private:
mutable std::vector<int> v_;
};