Предположим, у вас есть эти два произвольных типа, с которыми вы хотите создать экземпляр класса шаблона, первый из которых должен вызвать 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 точный класс» - довольно странное требование - не обязательно неправильное, но вонючее. Вероятно, есть некоторая особенность , присущая классу , которую вы должны проверить вместо этого. Но, возможно, в вашем случае использования действительно только когда-либо создавался шаблон для этих двух классов, и выше будет достаточно.