我知道这个问题听起来有点令人困惑,但请耐心等待。我希望这个例子至少可以让你了解我在问什么。
如果你对这个问题有更好的名字,请不要不告诉我,我会马上改的
所以我们开始吧!
假设我有课
template <size_t size_of_allocated_memory_in_bytes> class malloc_ptr
里面我有一个方法
template <typename cast_type, bool should_use_c_cast> cast_type cast();
这里是全班同学;
template <size_t size_of_allocated_memory_in_bytes>
class malloc_ptr
{
private:
void* ptr;
public:
malloc_ptr()
: ptr(malloc(size_of_allocated_memory_in_bytes)) {}
template <typename cast_type , bool should_use_c_cast>
cast_type cast();
~malloc_ptr() noexcept
{ free(ptr); }
};
我知道我可以实现这样的功能 [在 https://stackoverflow.com/questions/27283261/template-function-in-a-templated-class 的帮助下]
template<size_t size_of_allocated_memory_in_bytes>
template<class cast_type, bool should_use_c_cast>
cast_type malloc_ptr<size_of_allocated_memory_in_bytes>::cast()
{
return reinterpret_cast<cast_type>(ptr);
}
但是我只想在
should_use_c_cast == true
时实现该功能,但我不知道该怎么做。
希望大家对此有所帮助。此外,任何帮助将不胜感激。 提前谢谢你!
如果你想对真有一个实现,对假有一个实现,你需要 C++17 的
if constexpr
,因为你不能部分特化一个函数模板。
template<size_t size_of_allocated_memory_in_bytes>
template<class cast_type, bool should_use_c_cast>
cast_type malloc_ptr<size_of_allocated_memory_in_bytes>::cast()
{
if constexpr (should_use_c_cast) {
return reinterpret_cast<cast_type>(ptr);
} else {
// false case here
}
}
但是,您的
should_use_c_cast
案例有未定义的行为,所以我建议您甚至不需要 should_use_c_cast
,而是使用 placement new
template<size_t size_of_allocated_memory_in_bytes>
template<class cast_type>
cast_type * malloc_ptr<size_of_allocated_memory_in_bytes>::cast()
{
return new (ptr) cast_type;
}
一种方法是使用
enable_if
如下所示:
template <size_t size_of_allocated_memory_in_bytes>
class malloc_ptr
{
private:
public:
template <typename cast_type , bool should_use_c_cast>
//-------------------vvvvvvvvvvvvvvvvv--------------------->condition here
std::enable_if_t<should_use_c_cast,cast_type> cast();
};
使用 C++20,您可以使用
requires
:
template <size_t size_of_allocated_memory_in_bytes>
class malloc_ptr
{
private:
public:
template <typename cast_type , bool should_use_c_cast>
cast_type cast() requires(should_use_c_cast);
};