2012-06-29 40 views
1

我試圖做一個std::tuple,最終保存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夠了我的希望 - 當然,我結束了一個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 &const,這與double&沒有不同。你需要一個內部const:「參考到const T1」。

你可以用remove_referenceadd_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; 
相關問題