c – 使用可变参数模板进行显式模板实例化

c – 使用可变参数模板进行显式模板实例化,第1张

概述我有几个模板类Impl(带有一些抽象方法),它们部分在CPP文件中实现,因此我需要显式实例化我的模板以供链接器找到它,如下所示: template class Impl<T0>;template class Impl<T1>;template class Impl<T2>;...template class Impl<Tx>; 随着Tx类型数量的增长,我想找到一种比在所有必需文件中手动扩展 我有几个模板类Impl(带有一些抽象方法),它们部分在CPP文件中实现,因此我需要显式实例化我的模板以供链接器找到它,如下所示:
template class Impl<T0>;template class Impl<T1>;template class Impl<T2>;...template class Impl<Tx>;

随着Tx类型数量的增长,我想找到一种比在所有必需文件中手动扩展这些显式实例化列表更好的方法.我以为我可以使用可变参数模板,所以我尝试了以下方法:

template <template <class> class,class...>struct type_map;template <template <class> class BaseT,class... Ts>struct type_map<BaseT,std::tuple<Ts...>> {    using type = std::tuple<BaseT<Ts>...>;};typedef std::tuple<T0,T1,T2> MyTypes;

并在CPP文件中:

template class type_map<Impl,MyTypes>;

但是,这并没有按照我的意图实例化模板(链接器抱怨丢失的符号).

有没有办法使这种方法工作(即实例化模板而不实例化它的对象)或一种完全不同的方法,可以在这种情况下解决我的问题?

解决方法 我不认为您可以使用可变参数模板执行此 *** 作,但您可以使用预处理器执行此 *** 作.

我看到两个选择.一个是使用Boost.Preprocessor:

// DeFinitions:#define ARGUMENTS (T0)(T1)(T2)(T3)(Tx)#define INSTANTIATE(maUnused,maTemplate,maType) \  template class maTemplate<maType>;// Usage:BOOST_PP_SEQ_FOR_EACH(INSTANTIATE,Impl,ARGUMENTS)BOOST_PP_SEQ_FOR_EACH(INSTANTIATE,Impl2,ARGUMENTS)

另一个选择是使用X macro技巧:

x.hpp

X(T0)X(T1)X(T2)X(T3)X(Tx)#undef X

using_file.cpp

#define X(maType) template class Impl<maType>;#include "x.hpp"#define X(maType) template class Impl2<maType>;#include "x.hpp"
总结

以上是内存溢出为你收集整理的c – 使用可变参数模板进行显式模板实例化全部内容,希望文章能够帮你解决c – 使用可变参数模板进行显式模板实例化所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1239381.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存