簡體   English   中英

如何解析成員指針非類型模板參數的組件類型

[英]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::*;
};

現場演示

注意,在An是私有的,因此除非您將其公開,否則它將無法在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM