簡體   English   中英

如何將模板類限制為僅具有類型別名的特定專業化

[英]How to restrict template class to only specific specializations with type aliases

我要實現的目標是擁有帶有各種別名的模板化Wrapper類。 這是一個簡化的預覽:

template < typename Type >
class Wrapper {
public:
   Wrapper(Type* resource) : ptr(resource) {}
   ~Wrapper() { free(ptr); }

private:
   Type* ptr;
}

void free(SDL_Window* ptr) { SDL_DestroyWindow(ptr); }
void free(SDL_Renderer* ptr) { SDL_DestroyRenderer(ptr); }

using Window = Wrapper<SDL_Window>;
using Renderer = Wrapper<SDL_Renderer>;

我只允許創建Wrapper類的這些別名實例。 原因之一是,它是SDL資源指針的包裝,它根據指針的類型具有不同的內存釋放功能。

我想實現的最佳方案是使Wrapper類在使用創建的別名之外不可見。 也許有使用匿名名稱空間的解決方案,但是解凍意味着包裝器類不能在頭文件中。

我想實現的最佳方案是使Wrapper類在使用創建的別名之外不可見。

這可以通過使用private和wrapper類來實現

class WrapperAccessor {
    template < typename Type >
    class Wrapper {
    public:
       Wrapper(Type* resource) : ptr(resource) {}
       ~Wrapper() { free(ptr); }

    private:
       Type* ptr;
    };

public:
    using Window = Wrapper<SDL_Window>;
    using Renderer = Wrapper<SDL_Renderer>;
};

using Window = WrapperAccessor::Window;
using Renderer = WrapperAccessor::Renderer;

std::enable_if怎么樣,它將僅為您的類/函數啟用某些類型?

看一下C ++ 11和14中的type_traits 。您可以進行各種靜態檢查(在編譯時進行檢查)。 例如,要檢查類型是否符合您的期望,可以使用:

std::is_same<T,int>::value

如果Tint在編譯時返回true。

我認為這可以幫助

template <typename T, bool Allowed>
class WrapperBase;


template <typename T>
class WrapperBase<T, true>
{
};

template <typename T>
class WrapperBase<T, false>;

template < typename Type >
class WrapperBaseHelper : public WrapperBase<T, boost::is_base_of<SDL_Window, T>::value | boost::is_base_of<SDL_Renderer>::value ...e.t.c >
{
...
};

在您的特定情況下,我將使用std::unique_ptr ,例如:

template <typename T, T value> struct Call; // c++17 should allow Call<auto F>

template <typename T, void (*f)(T*)>
struct Call<void (*)(T*), f>
{
    void operator ()(T* p) const { f(p); }
};

#define AUTO(F) decltype(F), F // not needed in C++17

using Window = std::unique_ptr<SDL_Window, Call<AUTO(&SDL_DestroyWindow)>>;
using Renderer = std::unique_ptr<SDL_Renderer, Call<AUTO(&SDL_DestroyRenderer)>>;

這將處理已刪除的副本並糾正與您的代碼段相反的移動語義。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM