Предположим, у меня есть указатель на элемент данных, и я хочу знать, является ли он постоянным или нет. Другими словами:
struct S {
const int i; // this is const
int j;
};
В C ++ я делал что-то вроде этого:
template<typename Class, typename Type, Type Class:: *>
struct is_const_data_member: std::false_type {};
template<typename Class, typename Type, const Type Class:: *Member>
struct is_const_data_member<Class, const Type, Member>: std::true_type {};
template<typename Class, typename Type, Type Class:: *Member>
void foo() {
const auto bar = is_const_data_member<Class, Type, Member>::value;
// ...
}
Однако, теперь есть шаблонный шаблон auto
и список параметров шаблона очень элегантен:
template<auto Member>
void foo() {
// ...
}
В этом случае единственный способ узнать, указывает ли элемент данных на что-то, что является константой:
const auto bar = std::is_const_v<std::remove_reference_t<decltype(std::declval<Class>().*Member)>>;
Однако, это выглядит безобразно для меня, и я чувствую, что должен быть лучший способ сделать это.
Есть ли другое (более короткое) решение для этого?