Шаблон функции-члена с использованием boost :: function

Следующее TestClass работает:

#include <iostream>
#include <boost/function.hpp>
#include <boost/bind.hpp>

void ext_fun(const float f, int i)
{
    std::cout << f << '\t' << i << std::endl;
}

template <typename T>
class TestClass
{
public:
    boost::function <void (const T)> test_fun;
};

int main()
{
    TestClass<float> tt;
    tt.test_fun = std::bind(ext_fun, std::placeholders::_1, 10);
    tt.test_fun(2.1);
    return(0);
}

Однако я бы предпочел определить test_fun как шаблон функции-члена, т.е. что-то вроде

class TestClass
{
public:
    template <typename T> boost::function <void (const T)> test_fun;
};

Но если я это сделаю, я получаю эту ошибку компилятора: «ошибка: элемент данных« test_fun »не может быть шаблоном элемента».

Можно ли определить шаблон функции-члена с помощью boost::function? Если да, то как?

Спасибо

- Маттео


person Matteo M.    schedule 11.01.2014    source источник
comment
Извините, это не имеет смысла - это не то, что означает шаблон функции. Вы спрашиваете эквивалент, могу ли я превратить struct Foo { int a; }; в struct Foo { template <typename T> T a; };, чего вы не можете.   -  person Kerrek SB    schedule 11.01.2014
comment
@Kerrek SB Я имел в виду что-то вроде самого первого примера здесь или вопрос здесь, но используя boost::function   -  person Matteo M.    schedule 11.01.2014


Ответы (1)


Можно ли определить шаблон функции-члена с помощью boost::function? Если да, то как?

Я думаю, у вас здесь происходит небольшая путаница. Шаблон функции - это, прежде всего, функция. Ваш test_fun не является функцией, это объект-член класса TestClass. Объекты-члены нельзя использовать в шаблонах на C ++.

person Shoe    schedule 11.01.2014
comment
Итак, суть в следующем: методы класса могут быть шаблонными (например, здесь), но если я использую boost::function, у меня фактически будет не метод, а член объект. Так что это не может быть шаблонным. Это правильно? - person Matteo M.; 11.01.2014
comment
@MatteoM., Терминология метода класса не существует в C ++: вместо этого вам следует привыкнуть к функции-члену. Но да, концепция верна. boost::function - это тип класса, что приводит к тому, что объявление boost::function <void (const T)> test_fun; является объектом, который нельзя шаблонизировать. - person Shoe; 11.01.2014