【发布时间】:2018-03-03 10:12:23
【问题描述】:
我正在尝试创建一个可以将默认值作为非类型参数传递的模板。
从编译器的角度来看,原始类型(WINAPI 的HANDLE)是指针类型,但从用户的角度来看,它被视为整数类型。
// Somewhere in system headers
#define INVALID_HANDLE_VALUE ((HANDLE)(LONG_PTR)-1)
typedef void *HANDLE;
// My code
template<typename Handle, Handle Default>
class HandleWrapper
{
...
};
HandleWrapper<HANDLE, INVALID_HANDLE_VALUE>; // error: invalid nontype template argument of type `HANDLE`
我目前的解决方法:
template<typename Handle, uintptr_t Default>
class HandleWrapper
{
static_assert(std::is_pointer<Handle>::value, "Handle must be a pointer");
static constexpr Handle DefaultHandle = reinterpret_cast<Handle>(Invalid);
};
我想正确的解决方案是以某种方式指定 typename Handle 应该被视为一个整数类型 (uintptr_t),只要对话没有缩小。
【问题讨论】:
-
你的例子能编译吗?重新解释转换不是常量表达式。
-
我真的不明白你为什么需要一个模板。
-
@KerrekSB
reinterpret_cast是与static_cast不同的编译器指令。 -
@NeilButterworth 模板是必需的,因为不同的句柄可能有不同的默认值,它并不总是 -1。
-
但想必它总是一个整数?在这种情况下,我不明白为什么不能使用非模板构造函数。