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

Выбор кода при компиляции - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Сформировать строку состоящую из символов http://www.cyberforum.ru/cpp-beginners/thread1215837.html
Здравствуйте , помогите пожалуйста ввести с клавиатуры текст. Сформировать строку состоящую из символов порядковый номер которых в строке кратен 5 или 7. Исходный текст и результаты вывести в текстовый файл.
C++ Разделить числа на три подмножества используя класс Не работает класс Необходимо напечатать сперва все числа из отрезка A, B, потом все числа, меньшие A, потом все числа большие B.Использовать очереди и класс. В первой строке содержится 3 числа . Во второй строке содержится N положительных чисел. вход 5 488 894 921 16 973 752 344 выход 752 16 344 921 973 http://www.cyberforum.ru/cpp-beginners/thread1215836.html
C++ Переписать файл целых чисел так, чтобы сначала шли положительные, а потом - отрицательные
Дан файл целых чисел F. Используя вспомогательный файл H переписать компоненты файла F файл G так, чтобы сначала были записаны все положительные числа а потом все отрицательные???????очень нужна помощь
C++ Создать класс "устройство ввода" и унаследовать от него три разных класса
Помогите создать иерархию типов: -Клавишное устройство ввода, имеющие количество клавиш(целое) и название клавиш(строки); -Роликовое устройство ввода, имеющие направление движения ролика(строка) и возможность нажатия(логическое); -Манипулятор типа мышь, имеющий дополнительно стоимость(целое). Классы должны конструкторы, включая конструктор копирования, перезагруженную функцию ввода из потока.
C++ Двумерный массив, сравнение, поиск максимального, замена http://www.cyberforum.ru/cpp-beginners/thread1215825.html
Имеется двумерный массив 6х6. Если все элементы второго столбца равны 1, то заменить максимальный элемент таблицы на 100.
C++ Арифметические выражения в массиве Ну пожалуйста подскажите, нужен код на с++, а знаю только как на паскале, может это вам что-о подскажет Задан массив Х (2n), каждый элемент которого вычисляется а формула. Y (n), каждый элемент которого вычисляется по формуле Y (i) = X (i) + X (i + n), где и изменяется от 1 до n. program asdf; uses crt; const nmax=10; var a,b:array of integer; i,j,n:integer; begin подробнее

Показать сообщение отдельно
DrOffset
7092 / 4233 / 950
Регистрация: 30.01.2014
Сообщений: 7,008
26.06.2014, 04:13
Цитата Сообщение от Variag Посмотреть сообщение
Вот именно что от фонаря. Такой пример и я видел на просторах интеренета, но он мне не подходит. Вообще не в тему))
Еще как в тему.
Такие вещи через enable_if как раз и делаются. Только предикат нужно другой.
Код для С++03 (enable_if в этом случае можно взять из boost, либо написать самому, как я) - реализация через 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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <cstdio>
 
struct ClassA
{
    void SomeMethod()      { puts(__PRETTY_FUNCTION__); }
};
 
struct ClassB
{
    void SomeMethod(int a) { puts(__PRETTY_FUNCTION__); }
};
 
struct ClassC
{
    void SomeMethod()      { puts(__PRETTY_FUNCTION__); }
};
 
template <typename T>
struct has_param
{
    struct param    {};
    struct no_param { char a[2]; };
 
    static param    test(void (T::*)(int));
    static no_param test(void (T::*)());
 
    enum
    {
        value = sizeof(test(&T::SomeMethod)) == 1
    };
};
 
template <bool, class T = void>
struct enable_if
{};
 
template <class T>
struct enable_if<true, T>
{
  typedef T type;
};
 
template <typename T>
typename enable_if<has_param<T>::value, void>::type
    SomeFunction(T t, int x)
{
    t.SomeMethod(x);
}
 
template <typename T>
typename enable_if<!has_param<T>::value, void>::type
    SomeFunction(T t, int x)
{
    t.SomeMethod();
}
 
int main()
{
    ClassA a;
    ClassB b;
    ClassC c;
 
    SomeFunction(a, 1);
    SomeFunction(b, 1);
    SomeFunction(c, 1);
}
Код для С++11 будет немного отличаться, но в целом принцип тот же. Могу привести, если надо, но щас лень.

А вообще я бы сделал так (без шаблонных изысков, старая добрая перегрузка):
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
#include <cstdio>
 
struct ClassA
{
    void SomeMethod()      { puts(__PRETTY_FUNCTION__); }
};
 
struct ClassB
{
    void SomeMethod(int a) { puts(__PRETTY_FUNCTION__); }
};
 
struct ClassC
{
    void SomeMethod()      { puts(__PRETTY_FUNCTION__); }
};
 
template <typename T>
inline void some_function_proxy(T & t, void (T::*ptr)(), int)
{
    (t.*ptr)();
}
template <typename T>
inline void some_function_proxy(T & t, void (T::*ptr)(int), int x)
{
    (t.*ptr)(x);
}
 
template <typename T>
void SomeFunction(T t, int x)
{
    some_function_proxy(t, &T::SomeMethod, x);
}
 
int main()
{
    ClassA a;
    ClassB b;
    ClassC c;
 
    SomeFunction(a, 1);
    SomeFunction(b, 1);
    SomeFunction(c, 1);
}
Добавлено через 3 часа 36 минут
Кстати в С++11, есть довольно красивый и простой способ обобщить проверку сигнатуры функции. Ее можно использовать при решении задачи ТС:
иллюстрация
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
#include <type_traits>
#include <iostream>
 
struct ClassA
{
    void SomeMethod()      {}
};
 
struct ClassB
{
    void SomeMethod(int a) { }
};
 
struct ClassC
{
    void SomeMethod()      { }
};
 
void SomeFunc(int a) { }
 
//-----
 
template <typename T>
struct remove_class_from_member;
 
template <typename Ret, typename Class, typename ...Args>
struct remove_class_from_member<Ret (Class::*)(Args...)>
{
    typedef Ret (*type)(Args...);
};
 
template <typename Ret, typename ...Args>
struct remove_class_from_member<Ret (*)(Args...)>
{
    typedef Ret (*type)(Args...);
};
 
template <typename T, typename U>
struct check_sig
    : std::is_same<typename remove_class_from_member<T>::type, typename std::decay<U>::type>
{};
 
int main()
{
    std::cout << check_sig<decltype(&ClassA::SomeMethod), void()>::value << '\n';
    std::cout << check_sig<decltype(&ClassB::SomeMethod), void(int)>::value << '\n';
    std::cout << check_sig<decltype(&ClassC::SomeMethod), void()>::value << '\n';
    std::cout << check_sig<decltype(&SomeFunc), void(int)>::value << '\n';
}
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru