Как бороться с переменной const в шаблонном коде? - PullRequest
0 голосов
/ 31 октября 2018

У меня есть класс myClass, который является шаблонным, и я имею в виду использовать его для двух конкретных типов.

Проблема в том, что то, должно ли что-то быть const в myClass, зависит от того, было ли оно создано с первым типом (в котором почти все равно const) или со вторым типом (в котором в значительной степени все неконстантно).

Как мне решить эту проблему? Кажется, есть два возможных подхода.

Я мог бы написать const в шаблонном коде, как если бы он был для первого типа (тот, который на самом деле является const), а затем каким-то образом «выбросить» все эти константы, как только я создаю экземпляр со вторым типом? Это возможно?

Второй подход заключается в том, чтобы вообще не писать const, а затем, когда я создаю экземпляр myClass с первым типом, я создаю весь объект const. Похоже, это немного компенсирует отсутствие константности в самой реализации класса ...

Или, может быть, я могу сделать что-то еще?

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

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

Предположим, у вас есть эти два произвольных типа, с которыми вы хотите создать экземпляр класса шаблона, первый из которых должен вызвать const ness для ваших членов:

struct RequiresConst
{};

struct OtherStruct
{};

Затем вы можете написать несколько удобных шаблонов, таких как:

template<class T, bool B>
using conditional_const = typename std::conditional<B, const T, T>::type;

template<class T>
constexpr bool needsConst = std::is_same_v<T, RequiresConst>;

Это позволяет вам естественным образом объяснить, что вы хотите:

template<class T>
struct MyClass
{
    conditional_const<int, needsConst<T>> member;
};

Демо (включая тест).

Обратите внимание, что это работает только для переменных-членов. Я не знаю, как сделать функции const или не- const таким же удобным способом. Но вы могли бы написать постоянную и неконстантную версию для каждой функции и включить ровно одну из каждой пары с помощью std::enable_if (или некоторого другого SFINAE).

Следует также упомянуть, что «этот член должен быть константным, если параметр шаблона равен this точный класс» - довольно странное требование - не обязательно неправильное, но вонючее. Вероятно, есть некоторая особенность , присущая классу , которую вы должны проверить вместо этого. Но, возможно, в вашем случае использования действительно только когда-либо создавался шаблон для этих двух классов, и выше будет достаточно.

0 голосов
/ 31 октября 2018

Использовать класс type_traits.

Начните с пустого класса typetraits, затем специализируйте его для вашего первого типа. Поместите туда все нужные вам типы с константой.

Затем снова укажите его для второго типа и поместите туда типы без констант.

Наконец, в своем шаблонном классе используйте черты типа с типом шаблона, чтобы выбрать нужные типы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...