[英]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.