如何从类模板typedef参数创建静态成员函数?

how to create static member function from class template typedef argument?

提问人:Jon 提问时间:10/20/2023 最后编辑:user12002570Jon 更新时间:10/20/2023 访问量:68

问:

我正在尝试构建一个类模板,其中一个静态方法需要在模板参数中指定 typedef。 目标是指定这样的 typedef 并将其传递给我的模板。由此,Foo 类应该有一个具有确切 typedef 的静态成员函数typedef foobar = void __stdcall foo(int a, float b)Foo<foobar>();void __stdcall foo(int a, float b)

我这个模板类的初稿如下所示:

template<class T, class ... Args>
class Foo
{
    static T Bar(Args... args);
};

其中是从模板创建的静态方法。Bar

这不考虑调用约定、隐式此指针等......但是,我能够创建一个具有正确返回类型和参数的函数。是否可以从 typedef 创建函数?

C 静态方法 模板元编程 C++ 概念

评论

0赞 user12002570 10/20/2023
typedef foobar = void foo(int a, float b);无效。替换为 .typedefusing
0赞 463035818_is_not_an_ai 10/20/2023
xy问题?你到底想达到什么目的?
0赞 user12002570 10/20/2023
在 c++ 中,函数返回类型永远不能是函数类型。所以这是不可能的。使返回类型成为其他类型,如指针。
0赞 user12002570 10/20/2023
在原始问题已经有答案后,不要更改问题。相反,应该问一个新的单独问题。
0赞 Jon 10/20/2023
你是对的。我的意思是说使用。我不会说这是一个XY问题。目标无非是从 typedef 构建一个静态成员函数

答:

0赞 user12002570 10/20/2023 #1

是否可以从 typedef 创建函数?

是的,但语法不正确。正确的语法如下所示:typedef foobar = void __stdcall foo(int a, float b)

// note the use of "using" and also that "foo" is removed from here
using foobar = void __stdcall (int a, float b)

工作演示


现在来到更重要的问题,函数的返回类型永远不能是函数类型,所以即使我们能够 typedef 函数类型,它也不能用作静态函数的返回类型

请注意,如果 typedef 不是函数类型,则可以将其用作静态成员函数的返回类型,如下所示:

template<class T, class ... Args>
class Foo
{
    static T Bar(Args... args);
};

using foobar = void (*)(int a, float b); //pointer to function
int main()
{
    Foo<foobar> f;
}

评论

0赞 Jon 10/20/2023
明白了。最终目标显然是以某种方式提取 typedef 的返回类型并将其用作返回类型。
0赞 user12002570 10/20/2023
@Jon我可以更新答案。您是否希望静态方法具有签名或?也就是说,您基本上想从 typedef 中提取返回类型?void (int, int)void (T...)void
0赞 Jon 10/20/2023
void(int, int) 如果传入的是返回类型为 void 的函数签名和两个 int 类型的参数,则该签名是正确的。 当传递给 Foo 时,Bar 看起来像这样,我希望这是有道理的:)using signature = void(*)(int a, float b); //function signatureFoo<signature>static void Bar(int a, float b);using signature2 = int(*)(float x); Foo<signature2> static int Bar(float x);