Инверсия квалификатора типа const может быть достигнута с использованием мета-функции conditional
: https://en.cppreference.com/w/cpp/types/conditional
Для следующего кода требуется C ++ 17, однако для преобразования в C ++ 14 просто замените вхождения _v
на ::value
.
template <typename T>
using invert_const =
std::conditional_t<std::is_const_v<T>, std::remove_const_t<T>, const T>;
Для этого конкретного вопроса, пример использования будет тогда
static Foo<T> * newCpy(const Foo<invert_const<T>> * foo) {
return new Foo(new T(*(foo->var)), true);
}
В приведенном вами примере не ясно, что вы намереваетесь удалить изменчивый квалификатор, однако, если я просто неправильно понял предполагаемый вариант использования, возможна аналогичная инверсия с:
template <typename T>
using invert_volatile =
std::conditional_t<std::is_volatile_v<T>, std::remove_volatile_t<T>, volatile T>;
Они также могут быть составлены
template <typename T>
using invert_cv = invert_volatile<invert_const<T>>;
Мета-функция invert_cv
может затем использоваться следующим образом
static Foo<T> * newCpy(const Foo<invert_cv<T>> * foo) {
return new Foo(new T(*(foo->var)), true);
}