gpt4 book ai didi

c++11 - 作为可变参数模板参数的成员指针

转载 作者:行者123 更新时间:2023-12-04 19:30:20 26 4
gpt4 key购买 nike

是否可以将指向成员的指针作为可变参数模板参数传递。我似乎无法弄清楚语法。

对于函数调用,它的工作方式如下:

struct A
{
int a;
float b;
}

template <typename ... TArgs> void f(A *obj, TArgs ... params)
{
void *members[] { (&(obj->*params))... };
// ... do something ...
}

可以这样使用:
f(obj, &A::a, &A::b);

我想以类似的方式将参数传递给类模板
template <[something] ... params> class Foo
{
void Bar(A *obj)
{
void *members[] { (&(obj->*params))... };
// ... do something ...
}
};

应该像这样使用:
Foo<&A::a, &A::b> foo;
foo.bar(obj);

我无法弄清楚 [某事] 应该是什么。

如果成员类型已知并且只有一个参数,则可以这样做:
template <int A::*ptr> //...

有没有办法将其概括为成员指针的可变参数列表,其中成员具有不同的事先未知类型?

更新:固定已知类型的成员指针的可变参数包声明如下:
template<int A::*...ptr> struct Foo {};

现在我只需要用可以推断的类型名替换 int 。

使用 C++17,以下工作完美:
template<auto A::*...ptr> struct Foo {};

不幸的是,我需要一个适用于 C++14 的解决方案

最佳答案

在 C++14 中,您可以使用另一个间接级别来做到这一点:

struct A {
int a;
float b;
};

template<typename... T>
struct Bar {
template <T A::*... params>
struct Foo {
void Bar(A *obj) {
void *members[] { (&(obj->*params))... };
// ... do something ...
(void)members;
}
};
};

int main() {
A a;

Bar<int, float>::Foo<&A::a, &A::b> foo;
foo.Bar(&a);
}
auto关键字(如您所提到的,在 C++17 中针对非类型模板参数引入)或多或少地解决了此类问题。想想 std::integral_constant以及如果您不必每次都将类型指定为第一个参数,它会如何更加用户友好...

关于c++11 - 作为可变参数模板参数的成员指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44077207/

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