C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – 使用可变参数模板进行显式模板实例化大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我有几个模板类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 – 使用可变参数模板进行显式模板实例化所遇到的程序开发问题。

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

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。