1

我正在尝试将一堆模板化的函数指针存储在一个函数指针的数组中。

我试过了

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

它在 g++ 中给出编译错误

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

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

4

1 回答 1

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; });
于 2013-09-05T22:26:40.843 回答