gpt4 book ai didi

c++ - 是否可以将指针视为非类型模板参数中的整数类型?

转载 作者:行者123 更新时间:2023-11-30 05:04:07 25 4
gpt4 key购买 nike

我正在尝试创建一个模板,其中可以将默认值作为非类型参数传递。

从编译器的角度来看,原始类型(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),只要对话不缩小即可。

最佳答案

在我的代码中,我使用了一个模板化句柄包装器类,但我对它采用的方法与您对它的方法不同。我为每种类型的要包装的句柄定义了一个单独的 traits 类,然后使用模板参数指定要在包装器中使用的特征。

尝试在您的情况下做类似的事情,例如:

struct InvalidHandleTraits
{
using HandleType = HANDLE;
static constexpr HANDLE DefaultHandle = INVALID_HANDLE_VALUE;
//...
static void Close(HANDLE h) { CloseHandle(h); }
//...
};

struct NullHandleTraits
{
using HandleType = HANDLE;
static constexpr HANDLE DefaultHandle = NULL;
//...
static void Close(HANDLE h) { CloseHandle(h); }
//...
};

... other traits as needed...

template<typename traits = InvalidHandleTraits>
class HandleWrapper
{
public:
using HandleType = typename traits::HandleType;

HandleWrapper(HandleType h = traits::DefaultHandle) : m_handle(h) { std::cout << "constructor: " << h << std::endl; }
~HandleWrapper() { traits::Close(m_handle); }
//...

operator HandleType() { return m_handle; }

private:
HandleType m_handle;
};

然后您可以在需要时使用所需的traits类,例如:

HandleWrapper<> h = CreateFile(...);
// or:
// HandleWrapper<InvalidHandleTraits> h = CreateFile(...);

HandleWrapper<NullHandleTraits> h = CreateFileMapping(...);

Live Demo

关于c++ - 是否可以将指针视为非类型模板参数中的整数类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49079024/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com