2014-11-15 1 views
1

У меня есть этот код:Как я могу сделать boost :: variant return T(), когда what()! = T, или как проверить, является ли T == what()?

std::vector<boost::variant<int,float,std::string>> data; 
template<typename T> T Get(size_t i) 
{ 
    if (i < data.size()) 
     return boost::get<T>(data[i]); 
    return T(); 
} 

как я могу проверить, если get<T> не удалось, так что я могу return T() (без исключений, как это очень дорого для производительности)?

ответ

1

В общем, вы не можете.

Если вы знаете индексы типа, вы можете - возможно, сделать что-то хрупкое с variant::which.

Конечно, пожарный способ - написать посетителя самостоятельно. Вот доказательство концепции:

namespace detail { 
    template <typename T> 
    struct get_with_default_visitor : boost::static_visitor<T> { 
     T default_; 
     get_with_default_visitor(T dv) : default_(dv) {} 

     T const& operator()(T const& v) const { return v; } 

     template <typename Other> T operator()(Other const&) const { 
      return default_; 
     } 
    }; 
} 

template<typename T, typename Container> T Get(Container const& data, size_t i, T defaultvalue = T()) 
{ 
    if (i < data.size()) 
     return boost::apply_visitor(detail::get_with_default_visitor<T>(defaultvalue), data[i]); 
    else 
     return defaultvalue; 
} 

Посмотри Live On Coliru с

int main() { 
    std::vector<boost::variant<int, float, std::string> > data { 
     42, 3.14f, std::string("hello world") }; 

    for (int i = 0; i < 5; ++i) std::cout << Get<int>(data, i, -99) << "\t"; 
    std::cout << "\n"; 

    for (int i = 0; i < 5; ++i) std::cout << Get<float>(data, i, -9999e99) << "\t"; 
    std::cout << "\n"; 

    for (int i = 0; i < 5; ++i) std::cout << "'" << Get<std::string>(data, i, "#error#") << "'\t"; 
    std::cout << "\n"; 
} 

печати

42 -99 -99 -99 -99 
-inf 3.14 -inf -inf -inf  
'#error#' '#error#' 'hello world' '#error#' '#error#' 
+0

Добавлен fullblown пример [Live On Coliru] (HTTP: //coliru.stacked -crooked.com/a/9cac686da24380b1) – sehe

Смежные вопросы