所以我真的需要一个具有以下结构的类,其中类是模板化的,arr
是一个函数指针数组,但我似乎无法找出正确的语法:
--我的类.h--
#include <vector>
template <typename T>
class MyClass {
typedef void (*fptr)(std::vector<T> data);
static void foo(std::vector<T> data);
static void bar(std::vector<T> data);
static void baz(std::vector<T> data);
static const fptr arr[3];
};
--我的类.cpp--
#include "myclass.h"
#include <vector>
template <typename T> void MyClass<T>::foo(std::vector<T> data) { ... }
template <typename T> void MyClass<T>::bar(std::vector<T> data) { ... }
template <typename T> void MyClass<T>::baz(std::vector<T> data) { ... }
template <typename T> MyClass<T>::fptr MyClass<T>::arr[3] = { &foo, &bar, &baz };
如果有帮助,我的最终目标是让第四个成员函数从数组中调用 foo
、bar
或 baz
,这样我可以避免多个 if-else 语句的开销(我的实际实现有接近 50 个这样的函数)。有更好的方法吗?
最佳答案
fptr
声明const
, 所以定义它 const
也。另外,因为 Sort
是模板,需要typename
引用MyClass<T>::fptr
.
template<typename T>
const typename MyClass<T>::fptr MyClass<T>::arr[] = { &foo, &bar, &baz };
旁注:您将无法将此定义或静态函数的定义放入源文件中,因为它们是模板。
此外,考虑使用 using
而不是 typedef
, 和 std::array
而不是原始数组:
using fptr = void (*)(std::vector<T>);
static const std::array<fptr, 3> arr;
// [...]
template<typename T>
const std::array<typename MyClass<T>::fptr, 3> MyClass<T>::arr = { &foo, &bar, &baz };
Is there a better way to do this?
可能吧,但如果没有更多关于你想做什么的细节,我不能说。
关于具有函数指针常量数组的 C++ 模板化静态类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53967722/