【发布时间】:2016-07-22 22:41:43
【问题描述】:
我尝试制作一个仅适用于双精度类型和用户定义类型的模板。 用户可以通过包含的头文件中的 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 用任何不复杂的东西初始化,除了双精度,它不起作用。但我想为用户提供一种简单的方法来添加一个可行的替代方法来替代该功能。 第二次(已注释掉)尝试失败,因为这不是重载,如果 type 不存在,mytype 将不会被忽略,而是会输出错误。
编辑: 我有很多地方不使用模板,或者必须确保多个未连接的类使用相同的数据类型。我需要将实现保留在 .cpp 文件中。为了解决这个问题,我在所有相关位置都包含了一个头文件,以便用户可以在一个位置更改值并使其保持一致。问题来了,因为我一直想为double初始化,但是用户指定double作为Usertype是很自然的。
【问题讨论】:
-
这个设计让我觉得有点不寻常。是什么阻止某人做
using UserType = int之类的事情,然后明确写SpaceDiscretizer<int>?这不是你想要允许的,但在这种情况下它是完全合法的。我怀疑您可能试图以错误的方式做某事。 -
问题中没有足够的信息。但是似乎 SpaceDiscretizer 依赖于 Datatype::Usertype 的某些成员,该成员不存在于 double 中。
-
@templatetypedef 我的想法是,我认为头文件属于我自己或受过教育的开发人员领域,并且纯粹使用 SpaceDiscretizer
作为可避免的“最终用户”错误。