如何在 C++ 的模板类中使用模板参数有条件地实现模板函数

问题描述 投票:0回答:2

我知道这个问题听起来有点令人困惑,但请耐心等待。我希望这个例子至少可以让你了解我在问什么。

如果你对这个问题有更好的名字,请不要不告诉我,我会马上改的

所以我们开始吧!

假设我有课

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++ templates
2个回答
2
投票

如果你想对真有一个实现,对假有一个实现,你需要 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;
}

1
投票

一种方法是使用

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);

};
© www.soinside.com 2019 - 2024. All rights reserved.