C ++指向一个函数的指针,该函数将模板化类的实例作为参数

时间:2010-04-27 18:00:50

标签: c++ templates

我无法编译一个类,它将函数指针作为成员变量。指针是将类的实例作为参数的函数。

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

我得到“错误:数据成员'f'不能是成员模板”编译器是gcc 4.2。

修改

在使用模板之前,我只是

double (*f)(Vector v);

这也有效

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

但我希望有一个函数的函数指针,它将泛型Vector作为参数。

6 个答案:

答案 0 :(得分:2)

使用会员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 :(得分:2)

如果你想要一个“模板指针”,你可以尝试一个函数对象。下面的示例将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 :(得分:1)

这不是很有效的c ++,基本上你要找的是模板模板参数。

http://www.progdoc.de/papers/ttp/psi-ttp/psi-ttp.html 解释了所有关于他们的事情

通常情况下,如果你遇到这种情况,你想找到一个workaroumd,因为你的代码很快就会变得难以理解

答案 3 :(得分:0)

好吧,编译器在编译时不知道你将拥有多少f(每个可能TN一个?)。因此,编译器无法计算您的类的对象需要多少内存。这就是禁止这种结构的原因。

答案 4 :(得分:0)

你不能有一个模板指向函数,这是没有意义的。 但你能做的是

#include <vector>

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

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

(这里函数指针是一个模板化函数,哪个模板参数显式设置为int

答案 5 :(得分:0)

因为您的代码与以下内容一样有意义:



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

您正在尝试将成员变量设为模板。这不是一个有效的C ++构造,我严重怀疑它会是什么。

你如何做你真正想要的?我不确定,因为我不知道你到底想要完成什么以及为什么。