C++11 指向作为可变模板参数的成员的指针
是否可以将指针作为可变模板参数传递给成员。我似乎搞不懂语法 对于函数调用,其工作原理如下:C++11 指向作为可变模板参数的成员的指针,c++11,templates,c++14,template-meta-programming,C++11,Templates,C++14,Template Meta Programming,是否可以将指针作为可变模板参数传递给成员。我似乎搞不懂语法 对于函数调用,其工作原理如下: struct A { int a; float b; } template <typename ... TArgs> void f(A *obj, TArgs ... params) { void *members[] { (&(obj->*params))... }; // ... do something ... } f(obj, &
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);
Foo<&A::a, &A::b> foo;
foo.bar(obj);
template <int A::*ptr> //...
我希望以类似于类模板的方式传递params
template <[something] ... params> class Foo
{
void Bar(A *obj)
{
void *members[] { (&(obj->*params))... };
// ... do something ...
}
};
模板类Foo
{
空栏(A*obj)
{
void*成员[]{(&(obj->*参数))…};
//…做点什么。。。
}
};
应该这样使用:
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);
Foo<&A::a, &A::b> foo;
foo.bar(obj);
template <int A::*ptr> //...
Foo-Foo;
foo.bar(obj);
我很难弄清楚什么东西应该是什么
如果成员类型已知,并且只有一个参数,则可以这样做:
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);
Foo<&A::a, &A::b> foo;
foo.bar(obj);
template <int A::*ptr> //...
模板//。。。
对于成员指针的可变参数列表,如果成员是不同的未知类型,是否有一种方法可以将其推广
更新:固定已知类型的成员指针的可变参数包声明如下:
template<int A::*...ptr> struct Foo {};
模板结构Foo{};
现在我只需要将int替换为可以推断的typename
对于C++17,以下功能非常有效:
template<auto A::*...ptr> struct Foo {};
模板结构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);
}
结构A{
INTA;
浮球b;
};
模板
结构条{
模板
结构Foo{
空栏(A*obj){
void*成员[]{(&(obj->*参数))…};
//…做点什么。。。
(b)成员;
}
};
};
int main(){
A A;
酒吧:富富;
食品酒吧;
}
auto
关键字(如您所述,C++17为非类型模板参数引入)或多或少地解决了此类问题。想一想std::integral_constant
,如果不将每次类型指定为第一个参数,它将如何更方便用户……也许模板
?不幸的是,它无法编译