#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 という暗黙のクラスを使用してみました。これも成功にはつながりませんでした。プログラムをよりクリーンにするための提案はありますか? ところで、他にも間違いや非効率を見つけたら、遠慮なく指摘してください。読んでくれてありがとう。