跳过显式模板初始化以避免双重初始化

  • 本文关键字:初始化 c++ templates c++11
  • 更新时间 :
  • 英文 :


我试图制作一个只适用于double和用户定义类型的模板。用户可以通过包含的头文件中的typedef来选择用户定义的类型。

typedef float Usertype;

我通过在模板源文件的末尾写下以下内容来解决这个问题:

template class SpaceDiscretizer<Datatype::Usertype>;
template class SpaceDiscretizer<double>;

然而,当用户将Usertype定义为double时,我遇到了一个问题!我试着遵循一些方向,即这些主题:如何为相同类型的typedef提供模板专业化?,条件显式模板实例化

struct dummy{};
template class SpaceDiscretizer< std::conditional<std::is_same<double,Datatype::Usertype>::value, dummy, double>::type>;
//typedef typename std::enable_if<false,double>::type mytype;
//template class SpaceDiscretizer<mytype>;
template class SpaceDiscretizer<Datatype::Usertype>;

第一个不起作用,因为如果SpaceDiscretizer用任何非复杂的东西初始化,除了double,它就不起作用。但我想给用户一个简单的方法来添加一个工作的替代品来增加功能。第二次(注释掉)尝试失败,因为这不是重载,如果类型不存在,则不会忽略mytype,而是显示一个错误。

编辑:我有很多地方不使用模板,或者必须确保多个未连接的类使用相同的数据类型。我需要将实现保存在.cpp文件中。为了解决这个问题,我在所有相关的地方都包含了一个头文件,这样用户就可以在一个地方更改值,并使其保持一致。出现了一个问题,因为我总是想初始化double,但用户将double指定为Usertype是很自然的。

我不确定你想要什么,但。。。希望下面的例子能帮助

#include <iostream>
#include <type_traits>
typedef  float  userT;
//typedef  double  userT;
template <typename T, bool B = std::is_same<T, double>::value>
class SpaceDiscretizer;
template <>
class SpaceDiscretizer<userT, false>
 { public: static constexpr int val = 1; };
template <>
class SpaceDiscretizer<double>
 { public: static constexpr int val = 2; };
int main ()
 {
   SpaceDiscretizer<userT>   sd1;
   SpaceDiscretizer<double>  sd2;
   std::cout << "sd1 val = " << sd1.val << std::endl;
   std::cout << "sd2 val = " << sd2.val << std::endl;
   return 0;
 }

输出为

sd1 val = 1
sd2 val = 2

userT被定义为float和时

sd1 val = 2
sd2 val = 2

当CCD_ 3被定义为CCD_。

抱歉我英语不好。

最新更新