2016-01-13 3 views
1

предположить, что у меня есть такое определение варианта:по умолчанию для повышения :: вариант

typedef boost::variant < 
v1, 
v2, 
v3, 
... 
vn 
> v; 

и мне нужно написать класс для посетителей с функциями посетителей для каждого v1 В.н. так:

class myvisitor : public boost::static_visitor<bool> { 
    bool operator()(v1) {} 
    bool operator()(v2) {} 
    ... 
    bool operator()(vn) {} 
} 

Так что, если все такие функции одинаковы, кроме одного для v1, то я хотел бы только определить

bool operator()(v1) {} 

ш hile оставить все остальные в форме по умолчанию, чтобы избежать написания большого количества бесполезного и дублированного кода.

Так что, если это возможно? или может ли разработчик повышения сделать это в своей следующей версии?

ответ

3

Просто сделать "случай" открытый шаблон член operator() по умолчанию:

Live On Coliru

#include <boost/variant.hpp> 
#include <iostream> 

struct MyStruct { 
    int a, b, c; 
}; 

using V = boost::variant<int, MyStruct, std::string, double>; 

struct MyVisitor : boost::static_visitor<void> { 
    void operator()(int) const     { std::cout << __PRETTY_FUNCTION__ << "\n"; } 
    void operator()(std::string const &) const { std::cout << __PRETTY_FUNCTION__ << "\n"; } 

    // the default case: 
    template <typename T> void operator()(T const &) const { 
     std::cout << "FALLBACK: " << __PRETTY_FUNCTION__ << "\n"; 
    } 
}; 

int main() { 
    V v; 

    for (auto v : { V(42), V(3.14), V("hello world"), V(MyStruct{1,2,3}) }) 
     boost::apply_visitor(MyVisitor(), v); 
} 

Выход:

void MyVisitor::operator()(int) const 
FALLBACK: void MyVisitor::operator()(const T&) const [with T = double] 
void MyVisitor::operator()(const string&) const 
FALLBACK: void MyVisitor::operator()(const T&) const [with T = MyStruct] 
+0

Это круто, фантастический, захватывающий, удивительный и потрясающе !!!! – shengyushen

+0

Добро пожаловать в C++ :) Кроме того, в случае, если вам интересно, я передаю большинство своих ответов: [записано] (https://www.livecoding.tv/video/thread-cancellationvariant-visitor-fallback/) – sehe

+0

Я вдруг понимаю, что этот стиль кода открывает для меня совершенно новую возможность, я использовал программу ocaml, и у нее есть аналогичная нотация «_», которая соответствует всем, кроме предыдущих указанных. В C++ я вынужден писать awk-скрипты для генерации всех этих бесполезных случаев. Это освобождает меня от такого труда. – shengyushen

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