С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
42 / 42 / 17
Регистрация: 25.04.2014
Сообщений: 499

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

07.10.2015, 02:32. Показов 733. Ответов 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
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.10.2015, 02:32
Ответы с готовыми решениями:

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

FileStream и StreamReader дают разный результат
Народ кто знает почему результат разный??? Как такое может быть? Что делать чтобы результат в StreamReader был такойже? мб где ошибка? ...

Метод хорд и дихотомии дают разный результат
Задание F(x)=x^5+x^3-1 Входные параметры: a=0 b=-2 E=0,01 По дихотомии выдает c=-1,992, а по методу хорд дает...

2
265 / 165 / 56
Регистрация: 25.02.2015
Сообщений: 435
07.10.2015, 02:51
hrr<T>(0) - это вызов шаблонной функции с аргументом типа int.
из двух под такой вызов подходит только функция с эллипсисом, т.к. другая ожидает указателя на метод.
т.е. при любых T кандидат для вызова - short hrr(...) ну и результат всегда один и тот же: is_same<void, short> == false
1
42 / 42 / 17
Регистрация: 25.04.2014
Сообщений: 499
07.10.2015, 03:45  [ТС]
Цитата Сообщение от 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.10.2015, 03:45
Помогаю со студенческими работами здесь

Одинаковые вызовы одной и той же функции дают разный результат, почему так?
Друзья! Код: class Bar: def __init__(self): pass def somefun(self): return...

Когда a = a + b и a+= b дают одинаковый результат и когда разный
Приведите пример, когда a = a + b и a += b дают одинаковый результат и когда разный.

Тот же код - разный результат
Форумчане! Чем объяснить разницу в аутпуте: две while - одна copy pasted с другой - но в одной - при подсчете миль - нужно добавить 1 чтобы...

Один и тот же код с одинаковыми параметрами выдает разный результат
Добрый вечер. Уже не понимаю что PHP хочет. Ситуация такая: есть форма добавления некоторых данных в БД, а так же test.php для проверки...

Чем код с хабра лучше моего?
В особенности интересует метод проигрывающий ноты. import javax.sound.midi.*; public class MIDISyntesizer { Synthesizer...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru