Условные методы скрытия в шаблоне в зависимости от базового типаC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Условные методы скрытия в шаблоне в зависимости от базового типа

Сообщение Anonymous »

У меня есть шаблон, который получен из STD :: Vector или Std :: List. Мне нужно скрыть все методы, которые позволяют изменять размер базового контейнера. Я знаю, что я могу скрыть методы с помощью объявления. Проблема в том, что некоторые соответствующие методы доступны только для списка Std ::. Можно ли условно скрыть эти методы без явного перегрузки их (что было бы хлопотом)? Есть ли какой -нибудь причудливый синтаксис inable_if, который я также могу применить к объявлению с использованием? < /P>
template
struct Test : public BaseType
{
Test() = default;

private:
// Hide base members that are not supposed to be used directly
using BaseType::push_back;
using BaseType::insert;
using BaseType::assign;
using BaseType::emplace_back;
using BaseType::resize;
using BaseType::swap;

// These methods must be hidden BaseType==std::list, but are not available for std::vector
//using BaseType::merge;
//using BaseType::push_front;
//using BaseType::splice;
//using BaseType::emplace_front;
}
< /code>
Как обходной путь, я мог бы написать новые обертки базовых классов, которые выбираются с помощью STD :: Condental, как это, но это, безусловно, не слишком приятно: < /p>
template
struct CVector : public std::vector
{
using std::vector::vector;
protected:
using std::vector::assign;
using std::vector::emplace_back;
using std::vector::insert;
using std::vector::push_back;
using std::vector::resize;
using std::vector::swap;
};

template
struct CList : public std::list
{
using std::list::list;
protected:
using std::list::assign;
using std::list::emplace_back;
using std::list::insert;
using std::list::push_back;
using std::list::resize;
using std::list::swap;
using std::list::emplace_front;
using std::list::merge;
using std::list::push_front;
using std::list::splice;
};

template
struct Test : public std::conditional::type
{
Test() = default;
}


Подробнее здесь: https://stackoverflow.com/questions/794 ... -base-type
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»