Как проверить, является ли объект const без C ++ 11 std::is_const
? Насколько я знаю, я не должен быть const_cast
в объект, который был объявленный Const
Пример реализации для 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**
.)
Других решений пока нет …