2013-08-16 4 views
2

Я хочу создать template< typename F > using T = boost::variant< F, F const >; тип для хранения доступных для чтения и чтения-записи доступных значений в том же std::vector<T>. Но у меня есть следующая проблема программирования:boost :: variant of const и non-const

#include <iostream> 
#include <cstdlib> 

#include <boost/variant.hpp> 

int main() 
{ 
    using F = double; 
    using CV = boost::variant< F const, F >; 
    F const c = 0.0; 
    CV C(c); 
    F v = 0.0; 
    CV V(v); 
    std::cout << C.which() << ' ' << V.which() << std::endl; 
    return EXIT_SUCCESS; 
} 

Выход: 1 1. Как сохранить версию const значения типа F?

+0

Прежде всего, вам лучше понять __why __... затем искать решение. Я немного копаю в кишки «boost :: variant» и обнаруживаю, что для инициализации этих разных вариантов правильный инициализатор называется (например, 'const' и non-'const'), но он возвращает недопустимый индекс для параметра' const'. 'index' является частью типа инициализатора, который, очевидно, имеет некоторую ошибку (или, может быть, функцию) ... так что вам лучше вникать в' boost :: detail :: variant :: make_initializer_node' кишки для ответа (это вокруг строки 111 boost/variant/detail/initializer.hpp) – zaufi

+0

@zaufi Я попробую. Но это кажется слишком трудным для понимания. – Orient

+0

чтение (и понимание) код, написанный другими, - это ** очень полезное умение в любом случае ... используйте свой шанс его развить! :)) – zaufi

ответ

0

Это не решение, а что-то полезно:

#include <iostream> 
#include <functional> 
#include <cstdlib> 

#include <boost/variant.hpp> 

int main() 
{ 
    using F = double; 
    using CV = boost::variant< std::reference_wrapper< F const >, std::reference_wrapper<F> >; 
    F const c = 0.0; 
    CV C(std::ref(c)); 
    F v = 0.0; 
    CV V(std::ref(v)); 
    std::cout << C.which() << ' ' << V.which() << std::endl; 
    return EXIT_SUCCESS; 
} 

Это требует дополнительного пространства для хранения данных, если таковые имеются. В некоторых случаях он может быть более уместным, чем один в оригинальной постановке вопроса.