C ++ Указатель на функцию, которая принимает экземпляр шаблонного класса в качестве аргумента - PullRequest
3 голосов
/ 27 апреля 2010

У меня проблемы с компиляцией класса, в котором указатели на функции являются переменными-членами. Указатели на функции, которые принимают экземпляр класса в качестве аргумента.

Как

template<class T, int N>
double (*f)(Vector<T,N> v);

Я получаю сообщение об ошибке: элемент данных 'f' не может быть шаблоном элемента "

Редактировать

Перед использованием шаблонов у меня только что было

double (*f)(Vector v);

Это также работает

double (*f)(Vector<double,2> v)

Но я бы хотел иметь указатель на функцию, которая принимает в качестве аргумента универсальный вектор.

Ответы [ 6 ]

2 голосов
/ 27 апреля 2010

Если вы хотите иметь «указатель шаблона», вы можете попробовать функциональный объект. В приведенном ниже примере добавляется 1.0 в шаблон обернутой функции.

struct AcceptsVector {
  template<typename T, int N>
  double operator()(Vector<T,N> v) const { return 1.0 + real_f(v); }
};

AcceptsVector f;

Разница с «реальным» указателем шаблона заключается в том, что вы не можете переместить «AcceptsVector» для вызова другого шаблона, как вы можете это сделать с обычными указателями на функции. Привязка жестко закодирована во время компиляции. Однако вы можете передать f как указатель на функцию, и можете вызвать f с любым Vector<T, N> как шаблон.

2 голосов
/ 27 апреля 2010

Использовать член typedef:

template <typename T, int N>
class Vector
{
public:

    /// type of function pointer
    typedef double (*FuncPtr)( const Vector& );

};

// concrete type
typedef Vector<double,10> VecDouble10;

// actual function
double func( const VecDouble10>& );

// usage
VecDouble10::FuncPtr fp = func;
1 голос
/ 27 апреля 2010

Это не совсем корректно в C ++, в основном вам нужны параметры шаблона-шаблона.

http://www.progdoc.de/papers/ttp/psi-ttp/psi-ttp.html объясняет все о них

Как правило, если вы попадаете в эту ситуацию, вы хотите найти трудоемкость, потому что ваш код становится ОЧЕНЬ быстро ОЧЕНЬ быстро

0 голосов
/ 27 апреля 2010

Потому что ваш код имеет такой же смысл, как:



struct X
{
  template < typename T >
  std::vector<T> vect;
};

Вы пытаетесь сделать член переменную шаблоном. Это просто недопустимая конструкция C ++, и я серьезно сомневаюсь, что она когда-либо будет.

Как ты делаешь то, что на самом деле хочешь? Я не уверен, так как не знаю, чего вы на самом деле пытаетесь достичь и почему.

0 голосов
/ 27 апреля 2010

У вас не может быть шаблонного указателя на функцию, это не имеет смысла. Но то, что вы можете сделать, это

#include <vector>

template <typename T>
void foo(const std::vector<T>& v) {
   // do something
}

void (*ptr_foo)(const std::vector<int>&) = &foo<int>;

(здесь функция указывает на шаблонную функцию, аргумент шаблона которой явно установлен на int)

0 голосов
/ 27 апреля 2010

Что ж, компилятор не знает во время компиляции, сколько у вас будет f (по одному для каждого возможного T и N?). Поэтому компилятор не может рассчитать, сколько памяти нужно объектам вашего класса. Вот почему такие конструкции запрещены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...