gpt4 book ai didi

c++ - 在 #define 中使用模板参数类型

转载 作者:行者123 更新时间:2023-11-30 01:49:32 24 4
gpt4 key购买 nike

我的情况的上下文很难在这里详尽地解释,但是:我正在使用一个外部工具集(lib、bins 等),它从专有的 IDL 文件生成一些 c++ 代码。对于给定类型 T,它生成一个 T_Result 类。然后将生成的代码集成到我的项目中。

现在,我正在尝试根据模板参数的类型生成一个类型。

#define GENTYPE(x) x ## _Result

// class coming from generated includes. Copied here for clarity.
class int_Result
{};

template < class T >
class Connector
{
GENTYPE(T) _result;
public:

};

int main()
{
Connector<int> t;
/* ... */
}

当然,这是行不通的,因为c-预处理器使用T值作为它,所以GENTYPE宏在Connector类内部扩展为 T_Result 而不是想要的 int_Result 类。

可以使用#define 来生成整个类,但很难维护、调试等。

有谁知道实现这个目标的技巧吗?

最佳答案

而不是宏生成 Connector ,我们使用一个宏来生成映射 T 的特征类至 T_result .那么Connector只是使用那个特征类。

template<class T>struct result_type;

#define MRT(T) \
template<>struct result_type<T>{ \
using type = GENTYPE(T); \
}

template<class T>using result_t=typename result_type<T>::type;

现在简单地做一个MRT(int);制作result_t<int>int_result .宏必须在第一次使用 result_t<int> 之前使用.未能做到MRT(int)使 result_t<int>一个错误。

假设支持 C++11:现在是 2015 年。

Connector就做result_t<T> _result;

使用MRT是可选的,作为海峡

template<>struct result_type<int>{ using type=GENTYPE(int); };

甚至

template<>struct result_type<int>{ using type=int_result; };

不是那么冗长,并且减少了宏的层数。但是,它确实违反了 DRY(不要重复自己)。

关于c++ - 在 #define 中使用模板参数类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28966683/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com