繁体   English   中英

Class 成员名称作为非类型模板参数

[英]Class member names as non-type template parameter

我有一个 class ,它是从具有不同成员变量名称的工具生成的。 我想使用单个模板 class 来访问这些成员。 我可以通过使用非类型成员指针以下列方式执行此操作:

template<typename MODULE, 
    int MODULE::*a> class Foo {
public:
    Foo() {
        MODULE mod;
        std::cout << mod.*a;
    }
};

struct Bar {
    int random_name01234{20};
};

int main(int argc, char** argv, char** env) {
    Foo<Bar, &Bar::random_name01234> foobar;
}

但是,生成的 class(本示例中的 Bar)使用对我无权访问的成员的引用。 我不能将引用作为非类型模板参数传递,如此处所述 - 引用作为非类型模板参数

template<typename MODULE, 
    int& MODULE::*a> class Foo {
public:
    Foo() {
        MODULE mod;
        std::cout << mod.*a;
    }
};

class Bar {
private:
    int random_name01234{20};
public:
    int& random_name01234_ref{random_name01234};
};

int main(int argc, char** argv, char** env) {
    Foo<Bar, &Bar::random_name01234_ref> foobar;
}

错误:无法创建指向引用成员“Bar::random_name01234_ref”的指针

有没有另一种方法可以将随机成员名称传递给模板化的 function?

你不能有一个指向引用成员的指针(参见例如如何获得指向引用成员的指针?作为非类型模板参数的引用),但你可以有一个指向通过引用返回值的成员 function 的指针:

#include <iostream>


template<typename MODULE, 
    int& (MODULE::*a)()> class Foo {
public:
    Foo() {
        MODULE mod;
        std::cout << (mod.*a)();
    }
};

class Bar {
private:
    int random_name01234{20};
public:
    int& random_name01234_ref{random_name01234};
    int& get() { return random_name01234_ref;}
};

int main(int argc, char** argv, char** env) {
    Foo<Bar, &Bar::get> foobar;
}

如果你不能修改Bar那么你只需要使用一个不同的可调用来返回引用。 无论如何,我认为int (MODULE::*a)()太不通用了。 我宁愿让Foo接受任何可调用的,例如 lambda 表达式:

#include <iostream>


template<typename MODULE, typename F> class Foo {
public:
    Foo() {
        MODULE mod;
        std::cout << F{}(mod);
    }
};

class Bar {
private:
    int random_name01234{20};
public:
    int& random_name01234_ref{random_name01234};
};


int main(int argc, char** argv, char** env) {
    Foo<Bar,decltype([](Bar& b)->int&{ return b.random_name01234_ref;})> foobar;
}

未计算上下文中的 Lambda 表达式仅在 C++20 之后可用。 在它也能正常工作之前,只是稍微冗长一点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM