Проверьте, является ли const на C ++ 03

Как проверить, является ли объект const без C ++ 11 std::is_const? Насколько я знаю, я не должен быть const_castв объект, который был объявленный Const

9

Решение

Пример реализации для C ++ 11 is_const дается на cppreference, и это выглядит так:

template<class T> struct is_const          : false_type {};
template<class T> struct is_const<const T> : true_type {};

Если вы поместите это определение в код C ++ 03, вы можете использовать is_const там также, если вы добавите определения для false_type а также true_type (спасибо mfonantini за указание на пропавших без вести true_type а также false_type). Если вы определите их следующим образом, вы очень приблизитесь к определению, используемому в C ++ 11:

struct true_type {
static const bool value = true;
typedef bool value_type;
typedef true_type type;
operator value_type() const { return value; }
};

struct false_type {
static const bool value = false;
typedef bool value_type;
typedef false_type type;
operator value_type() const { return value; }
};

Разница лишь в том, что статический value это просто constне constexpr, но обратите внимание, что это, тем не менее, константное выражение и может использоваться в качестве аргумента шаблона. Поэтому для всех практических целей приведенное выше определение должно работать на C ++ 03.

Что касается последней части вашего вопроса: на самом деле нет проблем с приведением неконстантного типа к константному. (Однако незаконные ситуации могут возникать с указателями на указатели или ссылками на указатели, например, T** нельзя привести к const T**.)

12

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]