2017-02-19 6 views
2

이 고려 결과 :가 미리 계산하고 계산 된 온 - 더 - 플라이 허용 둘은

template <typename T> 
struct C { 
    std::vector<int> f(const T &t) const { 
     return t.f(); 
    } 
}; 

T::f 필요한 벡터를 계산해야합니다. 그러나 일부 T은 벡터를 미리 계산하므로 이러한 경우 복사본을 만들지 않는 것이 좋습니다. main에서 주석이 로컬 변수에 대한 참조를 반환으로 T=A를 들어, 위의 코드에 오류가, 알 수 있듯이

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; 
} 

: 여기 내 시도이다. T=AT=B을 모두 수용 할 수있어서 미리 계산 된 벡터 B::v_이 복사되지 않습니까?

template <typename T> 
struct C { 
    auto f(const T &t) const -> decltype(t.f()) { 
     return t.f(); 
    } 
}; 

이 값T = A에 의해 를 반환하고, const&T = B의 :

+0

코드가 컴파일되어 작동합니다. https://ideone.com/xedSqU – Zefick

+0

@Zefick 작동하는 것으로 * 표시되지만 OP가 올바르게 지적 했으므로 UB 인 로컬 변수에 대한 참조를 반환합니다. –

+0

왜 계산 된 벡터를 클래스 A에 저장할 수 없습니까? 복사 및 구문 문제를 모두 해결할 수 있습니다. – xinaiz

답변

4

만들기는 decltype를 사용하여, T::f으로 동일한 형식을 반환 C::f.

wandbox example

2

귀하의 시도는 무엇을해야 테스트되지 않습니다. 사전 계산 된 결과를 유용하게 사용하려면 영구적으로 유지해야합니다. 한 클래스는 계산과 저장을 모두 수행해야합니다. 예를 들어

,

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_; 
}; 

또 다른 아키텍처는 기능의 도메인을 정의하는 몇 가지 유형 X이 있다면, 하나 std::map< X, std::vector > (또는 unordered_map)의 모든 결과를 저장하는 것입니다.

+0

올바른 방법입니다. – xinaiz