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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Перегрузка операций http://www.cyberforum.ru/cpp-beginners/thread1061710.html
Нужно выполнить две перегрузки: 1) удаление элемента если он пустой; 2) сравнение по названию(равные). Подскажите как это реализовать. Читаю..вроде не сложно..но не пойму как правильно это сделать... Unit2.h #ifndef Unit2H #define Unit2H
C++ Строки Доброго времени суток, уважаемые. Сколько не парюсь над куском кода, так и не пойму, почему я не могу применить string в этом случае? А может я просто делаю это не правильно? struct students { string surname; int year_birth; int year_acquisition; int phys, math, info; http://www.cyberforum.ru/cpp-beginners/thread1061692.html
C++ Построить матрицу расстояний между всеми точками. Найти равноудаленные точки, если такие есть, и напечатать их номера
Всем привет. Помогите написать программу... На плоскости заданы n точек своими координатами. Построить матрицу расстояний между всеми точками. Найти равноудаленные точки, если такие есть, и напечатать их номера. Заранее спасибо!!!
C++ Разработать функцию поэлементного умножения массива на константу
Ребята, помогите написать программу на языке C++ ! Нужно разработать функцию поэлементного умножения массива на константу. Ну и результат вывести на экран, но это я и сам могу сделать :)
C++ Работа с указателями http://www.cyberforum.ru/cpp-beginners/thread1061679.html
Дана динамическая целочисленная матрица. Построить динамический одномерный массив, каждый элемент которого равен сумме элементов одной строке исходной матрицы. Освободить память от матрицы, найти произведение элементов одномерного массива и записать его как динамическую переменную. Все исходные данные, результаты и соответствующие адреса распечатать. Из этого всего меня больше...
C++ Решение линейных сравнений по модулю a*x = b (mod m) помогите для курсовой написать программу для решения линейных сравнений по модулю (a*x = b (mod m)) и систем таких сравнений. http://en.wikipedia.org/wiki/Simultaneous_congruence#System_of_linear_congruences с чего начать? подробнее

Показать сообщение отдельно
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
02.01.2014, 14:35     Реализация has_plus
Подкиньте идею как правильно реализовать аналог 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 поведение разное - возвращаемые типы детектируемого оператора разнятся.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 16:40. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru