2010-05-15 4 views
1

Boost.org-х example приведены для слияния :: преобразования выглядит следующим образом:Как использовать boost :: fusion :: преобразовать гетерогенные контейнеры?

struct triple 
{ 
    typedef int result_type; 

    int operator()(int t) const 
    { 
     return t * 3; 
    }; 
}; 
// ... 
assert(transform(make_vector(1,2,3), triple()) == make_vector(3,6,9)); 

Но я не «получить его.» Вектор в их примере содержит элементы того же типа, но основной точкой использования слияния являются контейнеры гетерогенных типов. Что, если бы они использовали make_vector(1, 'a', "howdy")?

int operator()(int t)
должен был бы стать
template<typename T> T& operator()(T& const t)

Но как бы я написать result_type? template<typename T> typedef T& result_type, конечно, недействителен синтаксис, и это не имело бы смысла, даже если бы оно было, потому что оно не привязано к функции.

+1

Вы уверены, что result_type требуется, а не потому, что парень любит поставить его там? В приведенном выше примере он, как представляется, использует примитивную форму decltype для формирования типа результата. – Puppy

+0

ugh, вы правы, это не требуется. Благодарю. Я собираюсь опубликовать новый вопрос с просьбой дать реальное руководство для boost :: fusion, эта документация на boost.org - это всего лишь шаг над чтением самого кода .. Grrr. – Kyle

ответ

5

Как правило, слитый :: преобразование используется с шаблонного (или -В показанном выше- противном случае перегружена) функции оператора:

struct triple 
{ 
    template <typename Sig> 
    struct result; 

    template <typename This, typename T> 
    struct result<This(T)> 
    { 
     typedef /*...figure out return type...*/ type; 
    }; 

    template <typename T> 
    typename result<triple(T)>::type 
    operator()(T t) const 
    { 
     return 3*t; // relies on existing operator*() for 'T' 
    } 
}; 

И, дополнительные источники информации о Fusion являются примерами и в тестовом каталоге, где вы можете найти демонстрации некоторых из этих методов.

С уважением Хартмут

+0

В частности, /libs/fusion/test/algorithm/transform.cpp - я понятия не имел, что эти тестовые файлы существуют. Благодаря! – Kyle

+0

'boost :: fusion :: transform', кажется, терпит неудачу, когда' F' является C++ лямбдой. Это известная проблема, или я не могу ее правильно вызвать? –

0

Вы пытались перегрузить оператор вызова()?

struct triple 
{ 

    int operator()(int t) const 
    { 
     return t * 3; 
    }; 
    int operator()(string t) const 
    { 
     return t + t + t; 
    }; 
};