声明指向模板函数的指针数组会产生编译错误

时间:2013-09-05 22:19:31

标签: c++ templates g++

我试图将一堆模板化的函数指针存储在数组中以实现函数指针。

我试过

template<typename T> 
void (*funcptrArray[100])(typename vector<T> &a,int,int,bool (*comp)(T,T));

它在g ++中提供了编译错误

  

**错误预期模板**之前的主要表达式

编辑: 我想在这里实现的是: 给出了10种不同的算法(模板化函数),用于相同的任务。我想在数组中存储不同的实例,以便我可以在循环中逐个迭代并运行它们

1 个答案:

答案 0 :(得分:1)

您只能创建类或函数模板。没有变量模板之类的东西(尽管如此,有人谈论过做类似的事情)。一种解决方法是使用类模板来提供对数组的访问:

template <typename T>
struct func_ptr {
    static void (*array[100])(std::vector<T>&, int, int, bool (*)(T, T);
};

template <typename T>
void (*func_ptr<T>::array[100])(std::vector<T>&, int, int, bool (*)(T, T);

这应该有效但不太可扩展。将数组包装到函数模板中并返回对数组的引用将更好地工作:这样很容易得到数组的一个实例,因为函数模板中的static变量需要在不同的实例化之间合并相同的参数。写出函数模板的返回类型有点尴尬:

template <typename T>
void (*(&funcPtrArray())[100])(std::vector<T>&, int, int, bool (*)(T, T))
{
    static void (*array[100])(std::vector<T>&, int, int, bool (*)(T, T));
    return array;
}

我想知道C ++ 11是否有帮助,但它没有:

auto funcPtrArray() -> void (*(&)[100])(std::vector<T>&, int, int, bool (*)(T, T))
{
    ...
}

然后您将使用该函数来获取数组,例如:

std::vector<int> vec;
funcPtrArray<int>()[12](vec, 1, 1, [](int a, int b){ return a < b; });