2016-09-12 117 views
2

我想測試一個變量類型的特性。我確實可以,但代碼太冗長了。通過類型變量輸入特徵

考慮一個例子,其中我定義相同類型的值的在容器中的類型的變量:

#include <vector> 

int main() { 
    std::vector<int> v, &rv=v; 

    // ‘rv’ is not a class, namespace, or enumeration 
    //rv::value_type i1; 

    // Ok 
    decltype(v)::value_type i2; 

    // decltype evaluates to ‘std::vector<int>&’, which is not a class or enumeration type 
    //decltype(rv)::value_type i3; 

    // Ok 
    std::remove_reference<decltype(rv)>::type::value_type i4; 
} 

我可以decltype住,但添加std::remove_reference是太多了。有沒有什麼好的方法來縮短代碼,而無需定義輔助模板?

+2

你想測試什麼屬性? (這看起來很像[XY問題](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)。) – molbdnilo

+0

Dunno,'remove_reference'行看起來不像對我不好,尤指考慮到你不會這麼做幾十次。話雖如此,答案可能是「不」。 –

+0

如果你反覆使用它,也許使用'using'語句並將它別名到'value_type'或其他東西 – jaggedSpire

回答

0

可以縮短,隨着

std::decay_t<decltype(rv)>::value_type i4 = 42; 

一個
std::decay_t<decltype(*std::begin(rv))> i4 = 42; 
0

使用一些使用聲明

using my_value_type = decltype(v)::value_type; 
using your_value_type = std::remove_reference<decltype(rv)>::type::value_type; 

您的代碼將變爲:

int main() { 
    std::vector<int> v, &rv=v; 

    using my_value_type = decltype(v)::value_type; 
    using your_value_type = std::remove_reference<decltype(rv)>::type::value_type; 

    my_value_type i2; 
    your_value_type i4; 
}