具有函数指针常量数组的 C++ 模板化静态类

标签 c++ arrays templates static function-pointers

所以我真的需要一个具有以下结构的类,其中类是模板化的,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 };

如果有帮助,我的最终目标是让第四个成员函数从数组中调用 foobarbaz,这样我可以避免多个 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 };

旁注:您将无法将此定义或静态函数的定义放入源文件中,因为它们是模板。

Demo

此外,考虑使用 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 };

Demo

Is there a better way to do this?

可能吧,但如果没有更多关于你想做什么的细节,我不能说。

关于具有函数指针常量数组的 C++ 模板化静态类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53967722/

相关文章:

c++ - 将方法的替代实现 (SFINAE) 移动到单独的文件

c++ - 升压::asio错误 "The I/O operation has been aborted..."

c# - 精美的UI桌面应用,选择哪个UI库?

java - 将字节数组从 AS3 发送到 Spring MVC servlet

javascript - 如何找到嵌套数组中每个元素出现的最大次数?

javascript - 使用 JS 过滤和搜索 2 个不同的对象数组

c++ - 如何返回相同的模板类以不同的顺序重用模板参数?

c++ - 无法使用 this 指针在对象上使用重载的 [] 运算符

c++ - 对于我的std::pair特化,我应该在哪里定义运算符>>?

c++ - 模板推导/类型转换错误