Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
DiffEreD
1430 / 767 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
#1

Реализация has_plus - C++

02.01.2014, 14:35. Просмотров 402. Ответов 5
Метки нет (Все метки)

Подкиньте идею как правильно реализовать аналог boost::has_plus.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
#include <type_traits>
#include <boost/type_traits/has_plus.hpp>
 
struct A { };
 
struct B
{
   void operator + (const B&) {}
};
 
namespace my_traits
{
template<typename T>
struct has_plus
{
   static const bool value = ??
   operator bool () const { return value; }
};
 
} //namespace my_traits
 
int main()
{
   std::cout << std::boolalpha;
   std::cout << "A has operator + :" << boost::has_plus<A>::value << std::endl;
   std::cout << "B has operator + :" << boost::has_plus<B>::value << std::endl;
 
   std::cout << "A has operator + :" << my_traits::has_plus<A>::value << std::endl;
   std::cout << "B has operator + :" << my_traits::has_plus<B>::value << std::endl;
 
   return 0;
}
Добавлено через 2 часа 6 минут
Частично решил так (взял за основу это: SFINAE — это просто) :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <iostream>
#include <type_traits>
#include <boost/type_traits/has_plus.hpp>
 
struct A { };
 
struct B
{
   void operator + (const B&) {}
};
 
struct C
{
   C operator + (const C&) { return C(); }
};
 
namespace my_traits
{
template<typename T>
struct has_plus
{
private:
    static void detect(...);
 
    template<typename U>
    static decltype(std::declval<U>().operator+(U())) detect(const U&);
public:
    static constexpr bool value = std::is_same<T, decltype(detect(std::declval<T>()))>::value;
};
} //namespace my_traits
 
int main()
{
   std::cout << std::boolalpha;
   std::cout << "A has operator + :" << boost::has_plus<A>::value << std::endl; //false
   std::cout << "B has operator + :" << boost::has_plus<B>::value << std::endl; //true
   std::cout << "C has operator + :" << boost::has_plus<C>::value << std::endl; //true
 
   std::cout << std::endl;
   std::cout << "A has operator + :" << my_traits::has_plus<A>::value << std::endl; //false
   std::cout << "B has operator + :" << my_traits::has_plus<B>::value << std::endl; //false
   std::cout << "C has operator + :" << my_traits::has_plus<C>::value << std::endl; //true
 
   return 0;
}
Но для структур B и C поведение разное - возвращаемые типы детектируемого оператора разнятся.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.01.2014, 14:35
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Реализация has_plus (C++):

Реализация - C++
Кто может помочь с одним моментом в курсовике , курсовик сделан почти весь, но там буквально 5-7 строчек кода нужно чтобы всё заработало. ...

Реализация идеи - C++
Доброго времени суток. Вопрос может быть будет странным.По сути у меня вот появилась идейка как жизнь улучшить немножко себе(ведь программы...

реализация класса - C++
Дано: класс &quot;Фильмы&quot; (название, жанр, главные роли). Вопрос: Возможно ли такой подход к реализации? class films { string...

Реализация стека - C++
Подскажите, как создать класс, который реализует стек? А также методы включения и выключения элементов?

Реализация функций - C++
Помогите, пожалуйста, реализовать методы классов (заголовки даны в biTree.g) Я плохо шарю, а завтра сдавать! Очень надо( Дан: biTree.h...

Dynamic_cast реализация - C++
Добрый вечер, есть застоявшаясь фраза: &quot;dynamic_cast&lt;Type*&gt;( pointer ) очень медленное, его лучше не использовать&quot; . Примерная...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Jupiter
Каратель
Эксперт С++
6554 / 3975 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
02.01.2014, 15:20 #2
DiffEreD, а что мешает посмотреть исходники? там даже комментарии есть
0
DiffEreD
1430 / 767 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
02.01.2014, 15:37  [ТС] #3
Исходники смотрел, но сложновато как то там с кучей разных макросов. И Qt Creator почему то не хочет по ним "прыгать". Полной реализации так и не нашел.
Вот файл has_plus.hpp, - но видимо я еще не дорос до полного его понимания:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
//  (C) Copyright 2009-2011 Frederic Bron.
//
//  Use, modification and distribution are subject to the Boost Software License,
//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
//  [url]http://www.boost.org/LICENSE_1_0.txt[/url]).
//
//  See [url]http://www.boost.org/libs/type_traits[/url] for most recent version including documentation.
 
#ifndef BOOST_TT_HAS_PLUS_HPP_INCLUDED
#define BOOST_TT_HAS_PLUS_HPP_INCLUDED
 
#define BOOST_TT_TRAIT_NAME has_plus
#define BOOST_TT_TRAIT_OP +
#define BOOST_TT_FORBIDDEN_IF\
   ::boost::type_traits::ice_or<\
      /* Lhs==pointer and Rhs==pointer */\
      ::boost::type_traits::ice_and<\
         ::boost::is_pointer< Lhs_noref >::value,\
         ::boost::is_pointer< Rhs_noref >::value\
      >::value,\
      /* Lhs==void* and Rhs==fundamental */\
      ::boost::type_traits::ice_and<\
         ::boost::is_pointer< Lhs_noref >::value,\
         ::boost::is_void< Lhs_noptr >::value,\
         ::boost::is_fundamental< Rhs_nocv >::value\
      >::value,\
      /* Rhs==void* and Lhs==fundamental */\
      ::boost::type_traits::ice_and<\
         ::boost::is_pointer< Rhs_noref >::value,\
         ::boost::is_void< Rhs_noptr >::value,\
         ::boost::is_fundamental< Lhs_nocv >::value\
      >::value,\
      /* Lhs==pointer and Rhs==fundamental and Rhs!=integral */\
      ::boost::type_traits::ice_and<\
         ::boost::is_pointer< Lhs_noref >::value,\
         ::boost::is_fundamental< Rhs_nocv >::value,\
         ::boost::type_traits::ice_not< ::boost::is_integral< Rhs_noref >::value >::value\
      >::value,\
      /* Rhs==pointer and Lhs==fundamental and Lhs!=integral */\
      ::boost::type_traits::ice_and<\
         ::boost::is_pointer< Rhs_noref >::value,\
         ::boost::is_fundamental< Lhs_nocv >::value,\
         ::boost::type_traits::ice_not< ::boost::is_integral< Lhs_noref >::value >::value\
      >::value\
   >::value
 
 
#include <boost/type_traits/detail/has_binary_operator.hpp>
 
#undef BOOST_TT_TRAIT_NAME
#undef BOOST_TT_TRAIT_OP
#undef BOOST_TT_FORBIDDEN_IF
 
#endif


Добавлено через 1 минуту
Jupiter, а в каком файле есть комментарии?

Добавлено через 2 минуты
С задачей в принципе я уже так разобрался:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
template<typename T>
struct has_plus
{
private:
    static int detect(...);
 
    template<typename U>
    static decltype(std::declval<U>().operator+(std::declval<U>())) detect(const U&);
public:
    typedef typename std::conditional<std::is_same<T, decltype(detect(std::declval<T>()))>::value,
                                       T, void>::type type;
    static constexpr bool value = std::is_same<type, decltype(detect(std::declval<T>()))>::value;
};
0
Jupiter
Каратель
Эксперт С++
6554 / 3975 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
02.01.2014, 15:46 #4
DiffEreD, в файле has_plus.hpp предварительные ласки начало, продолжение в хедере который подключается в 48-й строке, там есть комментарии

Не по теме:

Цитата Сообщение от DiffEreD Посмотреть сообщение
И Qt Creator почему то не хочет по ним "прыгать"
вообще разбирался в браузере



Добавлено через 1 минуту
Цитата Сообщение от DiffEreD Посмотреть сообщение
С задачей в принципе я уже так разобрался:
оператор плюс как минимум бинарный.
в бустовой реализации как минимум 6 проверок.
твоя последняя реализация не учитывает операторы-мемберы возвращающие int. поддержки глобальных операторов тоже нет.
2
gray_fox
What a waste!
1520 / 1223 / 70
Регистрация: 21.04.2012
Сообщений: 2,560
Завершенные тесты: 3
02.01.2014, 16:26 #5
DiffEreD, я делал так
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
template<typename T, typename U = T>
class has_plus {
 
   using yes = char (&)[1];
   using no  = char (&)[2];
   
   template<typename R>
   struct checker {}; 
   
   template<typename S, typename V>
   static no check(...);
   
   template<typename S, typename V>
   static yes check(checker<decltype(std::declval<S>() + std::declval<V>())> *);
   
public:
   static constexpr bool value = sizeof (check<T, U>(nullptr)) == sizeof (yes);
};
1
zarko97
276 / 36 / 0
Регистрация: 11.10.2015
Сообщений: 381
06.03.2017, 00:32 #6
DiffEreD,
Цитата Сообщение от DiffEreD Посмотреть сообщение
Вот файл has_plus.hpp, - но видимо я еще не дорос до полного его понимания:
похоже я тоже...

Добавлено через 15 минут
gray_fox, DiffEreD, а я так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    template<class ...>
    struct param_tester
    {
        using type = void;
    };
 
    template<class... Args>
    using void_t = typename param_tester<Args...>::type;
 
    template<class T, class voider = void_t<>>
    struct has_plus : std::false_type { };
 
    template<class T>
    struct has_plus<T, void_t<decltype(std::declval<T&>().operator+(std::declval<T&>()))>> : std::true_type { };
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.03.2017, 00:32
Привет! Вот еще темы с ответами:

Реализация 2-3 дерева - C++
Помогите пожалуйста реализовать 2-3 дерево

Реализация класса - C++
Так как только начал изучать с++, возникает вопрос: есть задание : Реализовать класс IntArray. Разработать тестовую программу для...

Реализация стека - C++
Здравствуйте, помогите пожалуйста с реализацией стека без использования STL. Стек отображен в памяти Вектором, память статическая(1...

Реализация md5() - C++
Как мне md5 хеш строки char получить? вон как просто в пхп - md5($string) гугл весь перерыл ничего нормального не нашел.. как...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
06.03.2017, 00:32
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru