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

标签 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,它就不起作用。但我想为用户提供一种简单的方法来添加一个有效的替代方法来替代 double in feature。 第二次(已注释掉)尝试失败,因为这不是重载,如果类型不存在,则不会忽略 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

userT 定义为 double 时。

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

关于c++ - 跳过显式模板初始化以避免双重初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38536224/

相关文章:

c++ - 使用来自共享对象的应用程序对象

c++ - 从任何基数到基数 10 c++ 的转换

c++ - 模板中的 const_cast。有 unconst 修饰符吗?

c++ - 如何在 C++ 中进行从枚举到类型的转换(并在模板中使用)?

c++ - 有和没有模板的功能相同

c++ - linux3/gcc46 : "-fnon-call-exceptions", 哪些信号是陷阱指令?

c++20 默认比较运算符和空基类

c++ - 在程序中使用非类型模板参数而不分配给局部变量时出现意外结果?

c++ - 为什么 std::tie 不能与 const 类方法一起使用?

C++:为什么这个 constexpr 不是编译时常量