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

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

Войти
Регистрация
Восстановить пароль
 
tapochka
40 / 40 / 8
Регистрация: 25.04.2014
Сообщений: 499
#1

с хабра и мой код дают разный результат. why - C++

07.10.2015, 02:32. Просмотров 214. Ответов 2
Метки нет (Все метки)

здравствуйте, ради обучения решил сделать проверку во время компиляции на наличие в классе функции, возвращающей void и принимающей int... компилируется, но результат неверный, ошибку не могу сам найти, помогите...

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
//======================имеется ли у класса функция void foo(int)=====================
 
template<typename T>
class hasVoidFooInt {
public:
    template<typename U>
    static constexpr auto hrr(void (U::* ptr)(int)) -> decltype(ptr((int)1));
 
    template<typename U>
    static constexpr short hrr(...);
 
// до прочтения статьи сделал так:
//    static constexpr decltype(hasVoidFooInt<T>::hrr<T>(0)) str=0;
//    static constexpr bool value = sizeof(str) != sizeof(short);
// но так было неправильно, сделал после прочтения статьи так, но результат не изменился:
    static constexpr bool value = std::is_same<void, decltype(hrr<T>(0))>::value;
};
 
//------------------------реализация из статьи с хабра-------------------------------------------
 
template<typename T> struct hasVoidFooInt_{
private:  // Спрячем от пользователя детали реализации.
    static int detect(...);  // Статическую функцию и вызывать проще.
    template<typename U> static decltype(std::declval<U>().foo(42)) detect(const U&);
public:
    static constexpr bool value = std::is_same<void, decltype(detect(std::declval<T>()))>::value;  // Вот видите, готово.
};
 
 
//====================================================================================
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.10.2015, 02:32
Здравствуйте! Я подобрал для вас темы с ответами на вопрос с хабра и мой код дают разный результат. why (C++):

Сборка и отладчик дают разный результат - C++
Нужно было написать программу для вывода всех минимальных по длине слов в строке. Как такое возможно? #include &lt;cstdio&gt; #include...

Почему выводится разный результат? - C++
int main(){ int mass={3,5,3,5,3}; int i=0, r=0; for(int i = 0; i &lt; 5; i++) if(mass % 3 == 0) ...

Одинаковые аргументы, разный результат - C++
Есть следующая функция: void line(float x1 , float y1 , float x2 , float y2 , float q , TGAColor c , TGAImage&amp; img ) { float...

Разный результат работы функции в release и debug - C++
Такая проблема. Есть программа, в которой объявляется переменная типа std::string. Ниже вызывается функция, реализованная в dll,...

Захват const переменной из лямбды: разный результат в g++ и clang - C++
Добрый день. #include &lt;iostream&gt; template &lt;class T&gt; void foo(const T&amp; t) { const int a = t; { ...

Подправьте мой код) - C++
Нужно вывести только буквы без символов input \\\aBaBba\\\ output AbBbBA #include &lt;iostream&gt; #include &lt;cstring&gt; ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Perfilov
264 / 165 / 43
Регистрация: 25.02.2015
Сообщений: 435
07.10.2015, 02:51 #2
hrr<T>(0) - это вызов шаблонной функции с аргументом типа int.
из двух под такой вызов подходит только функция с эллипсисом, т.к. другая ожидает указателя на метод.
т.е. при любых T кандидат для вызова - short hrr(...) ну и результат всегда один и тот же: is_same<void, short> == false
1
tapochka
40 / 40 / 8
Регистрация: 25.04.2014
Сообщений: 499
07.10.2015, 03:45  [ТС] #3
Цитата Сообщение от Perfilov Посмотреть сообщение
hrr<T>(0) - это вызов шаблонной функции с аргументом типа int.
хм, а здесь то почему все хорошо работает?)
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
#include <iostream>
 
template <typename T>
struct has_typedef_foobar {
    // Types "yes" and "no" are guaranteed to have different sizes,
    // specifically sizeof(yes) == 1 and sizeof(no) == 2.
    typedef char yes[1];
    typedef char no[2];
 
    template <typename C>
    static yes& test(typename C::foobar*);
 
    template <typename>
    static no& test(...);
 
    // If the "sizeof" of the result of calling test<T>(0) would be equal to sizeof(yes),
    // the first overload worked and T has a nested type named foobar.
    static const bool value = sizeof(test<T>(0)) == sizeof(yes);
};
 
struct foo {    
    typedef float foobar;
};
 
int main() {
    std::cout << std::boolalpha;
    std::cout << has_typedef_foobar<int>::value << std::endl;
    std::cout << has_typedef_foobar<foo>::value << std::endl;
}
Добавлено через 4 минуты
самое забавное, что в своей реализации я нигде имя то функции foo и не упомянул( это уже косяк походу

Добавлено через 43 минуты
хм, сделал так и заработало:
C++
1
2
3
4
5
6
7
8
9
10
11
template<typename T>
class hasVoidFooInt {
public:
    template<typename U>
    static constexpr auto hrr(int* ptr) -> decltype(std::declval<U>().foo(1));
 
    template<typename U>
    static constexpr short hrr(...);
 
    static constexpr bool value = std::is_same<void, decltype(hrr<T>(nullptr))>::value;
};
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.10.2015, 03:45
Привет! Вот еще темы с ответами:

Палиндромы. Плох ли мой код? - C++
Захотел решить задание, проверить есть ли число палиндромом или нет. Начал как всегда писать код(чисто свой вариант),а уже после этого,я...

Посмотрите на мой код. Матрицы - C++
Накидал вот такой косой код. Программа должна определить мин и макс элемент матрицы и поменять местами строки, содержащие их. программа у...

Поправьте мой код (шифратор файлов) - C++
Задача: сделать шифратор файлов на основе побайтового копирования с паролем вот, что у меня получилось: все работает, но только с...

проверьте, пожалуйста, мой первый код на c++ - C++
Переучиваюсь с Delphi на C++ Посмотрите, пожалуйста, корректность, стиль программирования, и т.п. с точки зрения visual c++ Если бы...


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

Или воспользуйтесь поиском по форуму:
Ответ Создать тему
Опции темы

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