gpt4 book ai didi

C++ typedef 函数定义作为类成员以便稍后用于函数指针?

转载 作者:行者123 更新时间:2023-11-28 07:00:18 27 4
gpt4 key购买 nike

我需要一个将函数定义/原型(prototype)存储为类成员的类,以便稍后使用它来获取基于该定义的函数指针。

#include <cstdlib>
#include <cstdio>
#include <functional>

template<typename... Ts>
class Function;

template <typename R>
class Function<R>
{
public:
using FuncType = R (*) ();

Function()
{
printf("R()\n");
}
};

template <typename R, typename... A>
class Function<R, A...>
{
public:
using FuncType = R (*) (A...);

Function()
{
printf("R(A)\n");
}
};

void fn1(int i) { printf("Called fn1: %d\n", i); }
void fn2(int i, float f) { printf("Called fn2: %d, %f\n", i, f); }
void fn3() { printf("Called fn3: N/A \n"); }

int main(int argc, char **argv)
{
Function<void, int> myFuncX;
Function<void, int, float> myFuncY;
Function<void> myFuncZ;

myFuncX.FuncType mf1 = fn1;
myFuncY.FuncType mf2 = fn2;
myFuncZ.FuncType mf3 = fn3;

fn1(244);
fn2(568, 1.891);
fn3();

return EXIT_SUCCESS;
}

对象直到运行时都是未知的,这就是我需要它们成为类成员的原因。它们存储在 std::map 中,我需要能够从 map 中获取特定项目并使用它的函数定义/原型(prototype)来存储函数的指针。

但我总是得到这种错误:

||=== Build: Win32 Release in Sandbox (compiler: GNU GCC Compiler) ===
.\src\testdummy.cpp||In function 'int main(int, char**)':
.\src\testdummy.cpp|42|error: invalid use of 'using FuncType = void (*)(int)'
.\src\testdummy.cpp|42|error: expected ';' before 'mf1'
.\src\testdummy.cpp|43|error: invalid use of 'using FuncType = void (*)(int, float)'
.\src\testdummy.cpp|43|error: expected ';' before 'mf2'
.\src\testdummy.cpp|44|error: invalid use of 'using FuncType = void (*)()'
.\src\testdummy.cpp|44|error: expected ';' before 'mf3'
||=== Build failed: 6 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===

我试过 std::function、typedef 等。为什么我会得到这个?

最佳答案

这是错误的:

myFuncX.FuncType mf1 = fn1;

您不能将类型别名用作普通成员 - 它是类范围内的声明,类似于 typedef。这将起作用:

decltype(myFuncX)::FuncType mf1 = fn1;

关于C++ typedef 函数定义作为类成员以便稍后用于函数指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22592783/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com