c++使用类成员作为模板参数

标签 c++ templates pointer-to-member

我想要一个带有 2 个模板参数的模板类:一个 Container 类和一个指向值数组的成员指针。

我有以下示例:

template<class CONTAINER,int * CONTAINER::*SomeMember>
struct Foo {
    Foo(CONTAINER *container) {
        this->value = container->*SomeMember;
        this->container = container;
    }
    CONTAINER *container;
    int value;
};

struct Bar1 {
    char bla;
    int y[42];
};
struct Bar2 {
    int blablab;
    char bla;
    int y[42];
};
struct Bar3 {
    int * x;
};

void TEST() {
    Bar1 b1;
    Bar2 b2;
    Bar3 b3;

    //This one fails with
    // error: could not convert template argument '&Bar1::y' to 'int* Bar1::*'
    // error: invalid conversion from 'Bar1*' to 'int' [-fpermissive]
    Foo<Bar1,&Bar1::y> foo3(&b1);

    //This fails too
    Foo<Bar2,&Bar2::y> foo2(&b2);

    //This is working
    Foo<Bar3,&Bar3::x> foo(&b3);
}

只要我不使用固定大小的数组,这些东西就可以正常工作。

我必须更正什么才能使这个示例正常工作?对我来说最重要的部分是让示例使用 Bar1 和 Bar2。

最佳答案

两个可能的选项可能如下所示。

我。向指向数组的 Bar1 添加一个额外的成员:

struct Bar1 {
    int y[42];
    int *z = y;
};
Foo<Bar1, &Bar1::z> foo1;

二。使 Foo 稍微更通用:

template<class, auto> struct Foo;
template<class Container, int *Container::*member> struct Foo<Container, member>;
template<class Container, int (Container::&member)[42]> struct Foo<Container, member>;

在 C++17 之前,您需要添加第三个模板参数:

template<class, typename T, T member> struct Foo;
template<class Container, int *Container::*member> struct Foo<Container, int *Container::*, member>;

关于c++使用类成员作为模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50585141/

相关文章:

c++ - c++中模板的部分特化

c++ - 转发引用的参数类型检查不起作用

c++ - 在 C++ 中使用指向成员函数的函数指针数组

c++ - 继承 - 符号未定义 Objective-C++

c++ - 显式特化函数模板的正确方法

c++ - 按顺序打印前缀树中的所有单词

c++ - 如何为 ZAP 实现处理程序?

c++ - 计算字母时出现奇怪的编译器错误

c++ - 网络消息格式化大量的 char、int,在 C\C++ 中转换