指向成员作为可变参数的模板
是否可以将指针指向成员作为可变参数传递。 我似乎无法弄清楚语法。
对于一个函数调用它的工作原理是这样的
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);
我想以类似的方式将params传递给类模板
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 {};
现在我只需要用可以推导出的typename来替换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
,如果你不必每次指定类型作为第一个参数,它会如何更友好...
上一篇: Pointers to member as variadic template parameters
下一篇: Varying number of definitions in a variadic template class