[英]how to parse component types of a member pointer non-type template argument
在下面的示例代碼中,類B具有三個模板參數。 我想知道是否可以從第三個論點中推斷出前兩個論點,我認為其中包含所有必要的信息。 現在,我正在使用宏,以避免繁瑣地以各種組合重復多次重復相同的名稱。 我認為應該有更好的方法。
在主我秀我非常希望寫什么。
B類的目標是:1)變量成員指針應明確地是類的非類型模板參數。2)它應適用於不同的類(例如A1,A2)和不同類型的成員變量。 如何重寫B類以實現上述目標並允許僅使用一個模板參數進行定義?
#include <iostream>
struct A1
{
int m_n;
A1() : m_n(10) {}
};
struct A2
{
double m_x;
A2() : m_x(2.1) {}
};
#define XXX(cls, member) cls, decltype(cls::member), &cls::member
// I would like B to have only the last template argument
template <typename C, typename T, T C::*P>
struct B
{
B(C& cls) : m_c(cls), m_v(cls.*P) {};
void set(T v) { m_v = v; }
void save() { m_c.*P = m_v; }
C& m_c;
T m_v;
};
int main()
{
A1 a1; std::cout << "a1.n=" << a1.m_n << std::endl;
A2 a2; std::cout << "a2.x=" << a2.m_x << std::endl;
// This is what I write
typedef B<XXX(A1,m_n)> m1_n_t;
typedef B<XXX(A2,m_x)> m2_x_t;
// This is what I woukd like to write
//typedef B<&A1::m_n> m1_n_t;
//typedef B<&A2::m_x> m2_x_t;
// this is how I use it
m1_n_t b1(a1); b1.set(5); b1.save(); std::cout << "a1.n=" << a1.m_n << std::endl;
m2_x_t b2(a2); b2.set(3.4); b2.save(); std::cout << "a2.x=" << a2.m_x << std::endl;
return 0;
}
您將具有以下內容:
template <class Type>
struct member_object;
template<typename RetType, typename ClassType>
struct member_object<RetType ClassType::*> {
using return_type = RetType;
using class_type = ClassType;
using member_type = RetType ClassType::*;
};
注意,在A
, n
是私有的,因此除非您將其公開,否則它將無法在decltype(&A::n)
進行編譯。
如果在編譯時需要實際的指針,則必須將其作為另一個模板參數顯式傳遞給它,如下所示:
template <class PtrType, PtrType Ptr>
struct member_object;
template<typename RetType, typename ClassType, RetType ClassType::* Ptr>
struct member_object<RetType ClassType::*, Ptr> {
using return_type = RetType;
using class_type = ClassType;
using member_type = RetType ClassType::*;
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.