在定义中使用模板参数类型 我的情况很难在这里详尽解释,但是我使用的是外部工具集LIB、BIN等,这些代码从专有IDL文件中生成了一些C++代码。对于给定的类型T,它生成一个T_结果类。生成的代码然后集成到我的项目中

在定义中使用模板参数类型 我的情况很难在这里详尽解释,但是我使用的是外部工具集LIB、BIN等,这些代码从专有IDL文件中生成了一些C++代码。对于给定的类型T,它生成一个T_结果类。生成的代码然后集成到我的项目中,c++,templates,c-preprocessor,C++,Templates,C Preprocessor,现在,我尝试根据模板参数的类型生成一个类型 #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() { Connecto

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

#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宏在连接器类中作为T_结果而不是想要的int_结果类展开

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


有人知道实现这一目标的诀窍吗?

我们使用宏来生成一个traits类,将T映射到T_结果,而不是宏生成连接器。然后连接器只使用那个traits类

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;
甚至

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

不是那么冗长,并且减少了宏的层数。但是,它确实不需要重复您自己。

我们使用宏来生成一个traits类,该类将t映射到t_结果,而不是宏生成连接器。然后连接器只使用那个traits类

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;
甚至

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

不是那么冗长,并且减少了宏的层数。但是,请不要重复。

如果您可以使用C++11,我建议您查看别名。它很适合模板制作。你能不能让模板有两个模板参数,一个用于类,一个用于结果?样板连接器t@rgoble:我需要模板类中的所有内容。我不能在模板外声明合成int_结果类。如果可以使用C++11,我建议查看别名。它很适合模板制作。你能不能让模板有两个模板参数,一个用于类,一个用于结果?样板连接器t@rgoble:我需要模板类中的所有内容。我不能在模板外声明合成int_结果类。我需要模板类内的所有内容。我不能在模板之外声明合成int_结果类。@norisknofun我看不出你的评论与我的答案有什么关系。你能更清楚一点吗?int_结果类不应该在连接器类的作用域之外被引用。这导致了同样的问题:预处理器将考虑T char,而不是真实的类t=int@norisknofun为什么不应该在连接器类的范围之外引用它?毫无意义的任意限制是没有帮助的:请解释原因。好的,试着读懂你的想法:我的代码没有声明int_Result或int_Result类型。它将result_t定义为int_result类型的别名,该类型必须由生成的include文件之类的人声明。我同意。此约束与项目相关。连接器类将通过共享库公开。这个共享库的客户端不应该知道这个生成的类…我需要模板类中的所有内容。我不能在模板之外声明合成int_结果类。@norisknofun我看不出你的评论与我的答案有什么关系。你能更清楚一点吗?int_结果类不应该在连接器类的作用域之外被引用。这导致了同样的问题:预处理器将考虑T char,而不是真实的类t=int@norisknofun为什么不应该在连接器类的范围之外引用它?毫无意义的任意限制是没有帮助的:请解释原因。好的,试着读懂你的想法:我的代码没有声明int_Result或int_Result类型。它将result_t定义为int_result类型的别名,该类型必须由生成的include文件之类的人声明。我同意。此约束与项目相关。连接器类将通过共享库公开。此共享库的客户端不应知道此生成的类。。。