2012-06-29 3 views
1

std::tuple을 참조로 사용하거나 참조가 없을 경우 복사하거나 이동 한 값을 유지하려고합니다. 현명한 (예 : 임시직).튜플에 const 참조 또는 const 값을 넣음

은 지금까지 내가 가지고 : 내가 무엇을 바라고 대한 가깝지만 아주 const 충분하지

#include <functional> 
#include <iostream> 

template <typename ...Args> 
struct foo { 
    const std::tuple<Args...> values; 
}; 

template <typename T1, typename T2> 
foo<T1, T2> make2(T1&& v1, T2&& v2) { 
    return foo<T1,T2>{std::tuple<T1, T2>(std::forward<T1>(v1),std::forward<T2>(v2))}; 
} 

int main() { 
    double d1=1000; 
    double& d2 = d1; 
    auto f = make2(d2, 0); 
    std::cout << std::get<0>(f.values) << ", " << std::get<1>(f.values) << "\n"; 
    d1 = -666; 
    std::get<0>(f.values)=0; // Allowed - how can I inject some more constness into references? 
    //std::get<1>(f.values) = -1; // Prohibited because values is const 
    std::cout << std::get<0>(f.values) << ", " << std::get<1>(f.values) << "\n"; 
} 

- 나는 const std::tuple<double&, int>와 끝까지 물론 나를 그 두 배를 수정할 수있는 튜플은 다음을 나타냅니다.

내가 const 좀 더 뿌리는 시도는 make2에 다움 :

template <typename T1, typename T2> 
foo<T1 const, T2 const> make2(T1&& v1, T2&& v2) { 
    return foo<T1 const,T2 const>{std::tuple<T1 const, T2 const>(std::forward<T1>(v1),std::forward<T2>(v2))}; 
} 

int (즉, 비 참조) 튜플 회원 const (몹시 흥분하지 주어진 내가 충분히 쉽게 전체 튜플 const을 할 수 제작에 성공 그), 그러나 double& 회원에게는 아무런 영향을주지 않았습니다. 왜? 그 여분의 const을 어떻게 추가 할 수 있습니까?

답변

1

T1 const이 최상위 레벨 const을 추가했기 때문에 작동하지 않았습니다. 즉, double&과 다르지 않은 double &const이됩니다. 내부 const가 필요합니다 : "참조 ~ T1".

당신은 remove_reference, add_constadd_reference의 조합이를 구축, 아니면 그냥 바로 이곳에 const을두고 작은 특성 작성할 수

template <typename T> 
struct constify { using type = T; }; 
// needs a better name 

template <typename T> 
struct constify<T&> { using type = T const&; }; 

// and an alias for UX ;) 
template <typename T> 
using Constify = typename constify<T>::type; 
관련 문제