当前位置: 首页 > 知识库问答 >
问题:

指向成员的指针作为可变模板参数

华旭
2023-03-14

是否可以将指针作为可变模板参数传递给成员。我似乎搞不懂语法。

对于函数调用,它的工作原理如下:

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 {};

现在我只需要将int替换为可以推断的typename。

和C 17,以下作品完美:

template<auto A::*...ptr> struct Foo {};

不幸的是,我需要一个解决方案,将与C 14

共有1个答案

姬凡
2023-03-14

在C14中,您可以使用另一个间接级别来完成此操作:

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

 类似资料:
  • 我想创建一个可变模板,用于计算指向成员的嵌套指针。我尝试了以下方法: 当我在VS中编译上述代码时,会收到以下错误消息: 错误C2672:“getField”:未找到匹配的重载函数 错误C2893:未能专门化函数模板“未知类型getField(T)” 如何修复以上变量模板编译,并返回?请注意,我的编译器不支持自动模板参数。

  • 假设有一个结构 我得到一个指向该结构的成员的指针,比如作为某个函数的参数: 如何获取指向包含对象的指针?最重要的是:在不违反标准中的某些规则的情况下,也就是说,我想要标准定义的行为,而不是未定义或实现定义的行为。 附带说明:我知道这规避了类型安全。

  • 所以我的教授喜欢用我们应该弄清楚的论文上的代码来测试我们。我不会发布代码,因为我不是在寻找答案,这只是他曾经让我们感到困惑的一件事是,当他初始化一个类的对象,然后初始化另一个类的指针指向上述对象时。它让我感到困惑,这是一个如此具体的问题,我不知道如何搜索它。例: “d- 当指针来自一个类却指向另一个类的对象时,它到底在做什么?我知道这个问题以前可能已经被回答过了,但是我在任何地方都找不到它,所以我

  • 我正在学习如何在C中使用并写了以下示例: 问:是否保证在所有情况下指向一个结构的指针都是指向它的第一个元素的完全相同的指针? 在这种特殊的情况下,它能像我预期的那样工作,但我不确定它是否能得到保证。编译器可以在开始时插入一些填充吗? 我唯一能找到的关于结构类型布局的是N1570的类型: 结构类型描述了一组按顺序分配的非空成员对象(在某些情况下,还包括一个不完整的数组),每个对象都有一个可选的指定名

  • GCC 8.2.1和MSVC 19.20编译以下代码,但Clang 8.0.0和ICC 19.0.1无法这样做。 Clang 8.0.0 的错误消息如下: 我注意到它在两种情况下可以用Clang编译: 从最后一个定义中删除括性 将线 替换为

  • 第三方DLL有一个函数,该函数需要一个指向结构的指针作为参数: 它将手指指纹(通常为4个)的“拍打”图像分割成单独的指纹(手指的文件名)。 SrapInfo的定义是: C中的示例片段: 根据JNA常见问题解答,在我的情况下,我应该使用“结构”: 所以,我用Java/JNA做了这样的映射: 但是使用这种方法,我得到了错误: 我还尝试了: < li >指针引用而不是SlapInfo。ByReferen