3
#include <type_traits>

template <typename T1, typename T2, typename is_allocated>
struct mutable_storage {};

template <
    template<typename, typename, typename> class storage_t,
    typename T2           = void,
    typename is_allocated = std::false_type
>
class Buffer : storage_t<Buffer<storage_t,void,void>, T2, is_allocated>
{};



int main() {
    typedef Buffer<mutable_storage> example_buffer;
}

このコードはコンパイルされます (少なくとも C++14 に続く GNU GCC コンパイラを使用して)。ただし、使用されている構文は嫌いです

class Buffer : storage_t<Buffer<storage_t,void,void>, T2, is_allocated>

Buffer を特殊化する必要がないため、次のように Buffer をテンプレート テンプレート パラメーターとして認識させたいと考えています。

class Buffer : storage_t<Buffer, T2, is_allocated>

次に、 mutable_storage 構造体に次のようなテンプレートの特殊化を認識させたいと思います

template <typename T2, typename is_allocated>
struct mutable_storage<Buffer, T2, is_allocated> { ... };

(「Buffer」はタイプではないため、もちろん許可されないため、これも変更する必要があります)。しかし、現在の使用方法では、タイプ Buffer で特殊化できるのは少し厄介です。たとえば、typedef を使用する

 typedef Buffer<storage_t, void, void> Buffer_Policy

も少し嫌な感じ。よりクリーンな方法を探しています。テンプレート テンプレート テンプレート パラメーターを作成しようとしましたが、テンプレート パラメーター内で余分なテンプレートが無限に流れてしまいます (template<...> がどのように機能するのか正確にはわかりません。 Buffer は、storage_t を宣言するために別の Buffer を必要とするものから継承します。また、inner_storage_t という暗黙のクラスを使用してみました。これも成功にはつながりませんでした。プログラムをよりクリーンにするための提案はありますか? ところで、他にも間違いや非効率を見つけたら、遠慮なく指摘してください。読んでくれてありがとう。

4

1 に答える 1