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_
不会被复制

Make
C::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_;
};