簡體   English   中英

在給定命名聲明的宏中使用變量聲明的類型

[英]Use type of variable declaration inside macro given named declaration

我有一個大型 C++20 代碼庫,其中包含一堆宏實例化,這些宏實例化是這個示例的簡單變體:

void main() {
  MAKE_VAR(int myInt);
  MAKE_VAR(CMyClass myClass);
  MAKE_VAR(CMyClass *pMyClass);
};

因為宏的實用程序是存在於代碼實際編譯之外的過程的一部分,所以#define目前是微不足道的:

#define MAKE_VAR(var) var

這意味着擴展后的結果代碼很簡單:

void main() {
  int myInt;
  CMyClass myClass;
  CMyClass *pMyClass;
};

但是,我正在嘗試向MAKE_VAR添加更多智能,這取決於變量的類型,並且出於兼容性原因,我無法更改該宏簽名(例如,讓宏將類型和名稱作為單獨的參數)。

所以,我的問題是是否有一些咒語,我可以使用var宏參數並只生成該參數的類型,以在隨后生成的代碼中用作模板參數。 請注意,我不需要說出這個名字(我也不相信標准 C++20 可以做到這一點)。

也就是說,我想提出一個宏定義,以便上面的MyStruct示例擴展為類似這樣的內容(需要任何額外的樣板文件):

void main() {
  int myInt;
  DoThing<int>();

  CMyClass myClass;
  DoThing<CMyClass>();

  CMyClass *pMyClass;
  DoThing<CMyClass *>();
};

我的第一次嘗試圍繞着試圖獲得一些我可以傳遞給decltype的東西,但我找不到任何允許該名稱存在的咒語。

我已經接近使用以下方法的解決方案,但我有一個不同的問題,它只能工作一次(因為FakeFunc每個實例沒有唯一的名稱 - 通常我會使用類似於__COUNTER__或類似的東西,但我需要它在這里跨兩條線工作):

template <typename Sig> struct ArgType;
template <typename Arg> struct ArgType<void(Arg)> { using type = Arg; };

#define MAKE_VAR(var) \
  var; \
  typedef void FakeFunc( var ); \
  DoThing<typename ArgType<FakeFunc>::type>();

void main() {
  MAKE_VAR(int myInt);
  MAKE_VAR(unsigned myUInt);
};

// Macro expands to:
void main() {
  int myInt;
  typedef void FakeFunc( int myInt );
  DoThing<typename ArgType<FakeFunc>::type>();

  unsigned myUInt;
  typedef void FakeFunc( unsigned myUInt );
  DoThing<typename ArgType<FakeFunc>::type>();
};

關於完成這種方法或使用不同方法的任何想法?

編輯:現在結束問題,因為我需要澄清為什么我不能將FakeFuncDoThing放在本地 scope 中,這是我在這個簡化問題中沒有捕捉到的細微差別......

您無需為 function 命名:

template <typename Sig> struct ArgType;
template <typename Arg> struct ArgType<void(*)(Arg)> { using type = Arg; };

template <typename T> void DoThing() {}

#define MAKE_VAR(var) \
  var; \
  DoThing<typename ArgType<void (*)( var )>::type>();

int main() {
        MAKE_VAR(int x)
        MAKE_VAR(unsigned y)
}

現場演示

宏擴展為

int x; DoThing<typename ArgType<void (*)( int x )>::type>();
unsigned y; DoThing<typename ArgType<void (*)( unsigned y )>::type>();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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