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

时间:2016-07-22 22:41:43

标签: c++ templates c++11

我尝试将模板设置为仅使用double和用户定义的类型。 用户可以通过包含的头文件中的typedef选择用户定义的类型。

typedef float Usertype;

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

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

但是当用户将Usertype定义为double时,我遇到了问题! 我试图遵循一些指示,即这些主题:How can I provide template specializations for typedefs of the same type?Conditional explicit template instantiation

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。

1 个答案:

答案 0 :(得分:1)

我不确定你想要什么但是......希望下面的例子有所帮助

#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

userT定义为double

p.s:抱歉我的英语不好。