Как использовать boost :: fusion :: transform для гетерогенных контейнеров? - PullRequest
1 голос
/ 16 мая 2010

Пример Boost.org для fusion :: transform выглядит следующим образом:

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 определенно не является допустимым синтаксисом, и он не имеет смысла, даже если бы он был, потому что он не привязан к функции.

Ответы [ 2 ]

5 голосов
/ 16 мая 2010

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

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 голосов
/ 16 мая 2010

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

struct triple
{

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