提问人:Jon 提问时间:10/20/2023 最后编辑:user12002570Jon 更新时间:10/20/2023 访问量:68
如何从类模板typedef参数创建静态成员函数?
how to create static member function from class template typedef argument?
问:
我正在尝试构建一个类模板,其中一个静态方法需要在模板参数中指定 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 创建函数?
答:
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 signature
Foo<signature>
static void Bar(int a, float b);
using signature2 = int(*)(float x); Foo<signature2> static int Bar(float x);
评论
typedef foobar = void foo(int a, float b);
无效。替换为 .typedef
using