Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

has_pre_decrement

Boost , Chapter 1. Boost.TypeTraits , Alphabetical Reference

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext
template <class Rhs, class Ret=dont_care>
struct has_pre_decrement : public true_type-or-false_type {};

Наследники:Если (i)<rhs>типа<Rhs>можно использовать в выражении<--rhs>, и (ii)<Ret=dont_care>или результат выражения<--rhs>конвертируем в<Ret>, то наследуется отtrue_type, в противном случае наследуется отfalse_type.

По умолчанию поведение<Ret=dont_care>не проверяется на возвратное значение префикса<operator-->. Если<Ret>отличается от типа по умолчанию<dont_care>, то значение возврата проверяется на конвертируемость в<Ret>. Конвертируемое к<Ret>означает, что возвращаемое значение оператора может быть использовано в качестве аргумента для функции, ожидающей<Ret>:

void f(Ret);
Rhs rhs;
f(--rhs); // is valid if has_pre_decrement<Rhs, Ret>::value==true

Если<Ret=void>, то тип возврата проверяется точно<void>.

Заголовок:<#include <boost/type_traits/has_pre_decrement.hpp>>или<#include<boost/type_traits/has_operator.hpp>>или<#include<boost/type_traits.hpp>>

Совместимость компилятора:Требуется работа SFINAE (т.е. BOOST_NO_SFINAE не установлен). Этого не поддерживает лишь меньшинство довольно старых компиляторов.

Примеры:

<has_pre_decrement<Rhs,Ret>::value_type>является типом<bool>.

<has_pre_decrement<Rhs,Ret>::value>— интегральное постоянное выражение<bool>.

<has_pre_decrement<int>::value>— интегральное постоянное выражение<bool>, оценивающее до<true>.

<has_pre_decrement<long>>наследуется от<true_type>.

<has_pre_decrement<int,int>>наследуется от<true_type>.

<has_pre_decrement<int,long>>наследуется от<true_type>.

<has_pre_decrement<double,double>>наследуется от<true_type>.

<has_pre_decrement<double,int>>наследуется от<true_type>.

<has_pre_decrement<bool>>наследуется от<false_type>.

<has_pre_decrement<constint>>наследуется от<false_type>.

<has_pre_decrement<void*>>наследуется от<false_type>.

<has_pre_decrement<int,std::string>>наследуется от<false_type>.

См. также:Типы операторов

Известные вопросы:

  • Эта черта не может определить, является ли префикс<operator-->общедоступным или нет: если<operator-->определен как частный член<Rhs>, то инстанцирование<has_pre_decrement<Rhs>>приведет к ошибке компилятора. По этой причине<has_pre_decrement>не может использоваться для определения того, имеет ли тип публичный<operator-->или нет.<
    structA{private:voidoperator--();};
    boost::has_pre_decrement<A>::value;// error: A::operator--() is private
    
    >
  • Существует проблема, если оператор существует только для типа<A>и<B>является конвертируемым в<A>. В этом случае компилятор сообщит о двусмысленной перегрузке.<
    structA{};
    voidoperator--(constA&);
    structB{operatorA();};
    boost::has_pre_decrement<A>::value;// this is fine
    boost::has_pre_decrement<B>::value;// error: ambiguous overload
    
    >
  • Существует проблема при применении этой черты к классам шаблонов. Если<operator-->определен, но не связывается для данного типа шаблона, он все еще обнаруживается чертой, которая возвращается<true>вместо<false>. Пример:<
    #include<boost/type_traits/has_pre_decrement.hpp>
    #include<iostream>
    template<classT>
    structcontains{Tdata;};
    template<classT>
    booloperator--(constcontains<T>&rhs){
    	returnf(rhs.data);
    }
    classbad{};
    classgood{};
    boolf(constgood&){}
    intmain(){
    	std::cout<<std::boolalpha;
    	// works fine for contains<good>
    	std::cout<<boost::has_pre_decrement<contains<good>>::value<<'\n';// true
    	contains<good>g;
    	--g;// ok
    	// does not work for contains<bad>
    	std::cout<<boost::has_pre_decrement<contains<bad>>::value<<'\n';// true, should be false
    	contains<bad>b;
    	--b;// compile time error
    	return0;
    }
    
    >
  • <volatile>квалификатор не обрабатывается должным образом и приведет к неопределенному поведению

PrevUpHomeNext

Статья has_pre_decrement раздела Chapter 1. Boost.TypeTraits Alphabetical Reference может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Alphabetical Reference ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-20 07:05:50/0.0091249942779541/1