Есть ли способ изменить тип с помощью type_traits в списке параметров шаблона? - PullRequest
0 голосов
/ 01 ноября 2018
template
<
    template <typename, typename, typename>
        class storage_t,
    typename _Tp = storage::unknown_type,
    typename is_allocated = std::false_type
>
struct Example_Buffer:
    public Buffer<storage_t, _Tp, is_allocated> { ... };

В этом коде я хочу удалить ссылку, если она есть у _Tp. Я не хочу использовать typename = std::enable_if_t<std::is_reference_v<_Tp>>, потому что я хочу, чтобы программа компилировалась, если _Tp является ссылкой, но я хотел бы удалить ее в этом случае. Я думал о решении, но оно не казалось идеальным:

template
<
   template <typename, typename, typename>
        class storage_t,
    typename _Tp = storage::unknown_type,
    typename is_allocated = std::false_type,
    typename _Tp2 = std::remove_reference_t<_Tp>
>
struct Example_Buffer { ... };

РЕДАКТИРОВАТЬ: Это не кажется идеальным, потому что кажется, что тип _Tp2 не является необходимым и его можно избежать. Я могу ошибаться; если да, пожалуйста, скажите мне.

Есть ли лучший способ сделать это? Не стесняйтесь спрашивать, если мне нужно уточнить.

РЕДАКТИРОВАТЬ: Я действительно забыл упомянуть текущее решение:

struct Example_Buffer
    : public Buffer<storage_t, std::remove_reference_t<_Tp>, is_allocated { ... };

Однако я могу захотеть использовать _Tp в Example_Buffer struct, так что это тоже не идеально.

...