2012-05-17 5 views
2

Я хотел бы получить частную классификацию шаблонов на основе того, будет ли работать boost::fusion::invoke() с определенной последовательностью Fusion. Но, похоже, что сбой замены в этом случае является ошибкой.Boost Fusion invoke и SFINAE

Я думаю, мне нужен is_callable_with_these_sequence_parameters<F, Seq> metafunction, который работает. Может ли кто-нибудь помочь?

struct F 
{ 
    template<class> struct result; 
    template<class F> struct result<F(float)> { typedef int type; }; 
    int operator()(float) { std::cout << "invoked (float)\n"; } 
}; 

template <class Sequence, class Enable=void> 
struct A 
{ 
    A() { std::cout << "invoked nothing\n"; } 
}; 

// Partial specialization 
template <class Sequence> 
struct A<Sequence, typename boost::fusion::result_of::invoke<F, Sequence>::type> 
{ 
    A() { boost::fusion::invoke(F(), Sequence()); } 
}; 

static void test() 
{ 
    A<boost::fusion::vector<float> >(); // should print "invoked (float)" 
    A<boost::fusion::vector<char, char> >(); // should print "invoked nothing" 
} 
+0

Uhh. Я думаю, что я понял код, но не могу понять, что с ним не так. Что * должен * распечатать? Не могли бы вы уточнить? – ulidtko

+0

Он не компилируется как есть на MSVC 2010. Частичная специализация не работает так, как я надеялся. – paperjam

ответ

3

После некоторого расследования я считаю, что это ошибка в повышении.

Отмечено here, никаких обходных решений пока нет.


Update: некоторые некорректное поведение boost::fusion было зафиксировано, в соответствии с билетом.

+0

Большое спасибо за вашу помощь! Я буду следить за этой проблемой и тем временем попробовать другой подход. – paperjam

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