我试图制作一个只适用于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_。
抱歉我英语不好。