Скорее всего, вам просто нужен тип выражения &arg.data[0]
, для которого вы можете использовать decltype
.
Вы также можете использовать std::conditional
для различенияпадежи.
template<typename T>
void f(T& arg) {
// C++17: using ftype = std::conditional_t<std::is_const_v<T>, const float *, float *>;
using ftype = typename std::conditional<std::is_const<T>::value, const float *, float *>::type;
ftype ptr = &arg.data[0];
// ... do stuff with ptr ...
}
Если бы вместо float *
у вас был параметр второго типа U
, вы бы включили std::add_const
template<typename T, typename U = float *>
void f(T& arg) {
// C++17: using ftype = std::conditional_t<std::is_const_v<T>, std::add_const_t<U>, U>;
using ftype = typename std::conditional<std::is_const<T>::value, typename std::add_const<U>::type, U>::type;
// ... do stuff with ftype ...
}
Я отметил, где C ++14 и C ++ 17 имеют более приятный синтаксис для эквивалентного использования.C ++ 11 отсутствие шаблона using
s и переменных шаблона приводит к подробным функциям типа: (.