Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++11 指向作为可变模板参数的成员的指针_C++11_Templates_C++14_Template Meta Programming - Fatal编程技术网

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
,如果不将每次类型指定为第一个参数,它将如何更方便用户……

也许
模板
?不幸的是,它无法编译