Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.02.2013, 23:29   #11
_SOKOL_
Пользователь
 
Регистрация: 02.02.2013
Сообщений: 44
По умолчанию

Цитата:
Сообщение от Granus Посмотреть сообщение
Кстати, 11ый стандарт вы проходили?
да, весь курс прошел
_SOKOL_ вне форума Ответить с цитированием
Старый 03.02.2013, 23:37   #12
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

Ну, тогда вспоминайте про variadic templates и вперед)
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 03.02.2013, 23:45   #13
_SOKOL_
Пользователь
 
Регистрация: 02.02.2013
Сообщений: 44
По умолчанию

лучше завтра сделаю, на свежую голову
а про variadic впервые слышу...
_SOKOL_ вне форума Ответить с цитированием
Старый 03.02.2013, 23:47   #14
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

Цитата:
а про variadic впервые слышу...
Это странно, одна из самых крутых штук 11ого стандарта. В общем, вот и узнаете)
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 03.02.2013, 23:52   #15
_SOKOL_
Пользователь
 
Регистрация: 02.02.2013
Сообщений: 44
Сообщение

Цитата:
Сообщение от Granus Посмотреть сообщение
Это странно, одна из самых крутых штук 11ого стандарта. В общем, вот и узнаете)
нам показывали функции с неограниченным числом аргументов, про классы с неограниченным числом типов данных я не знал

они как то так выглядят?
Код:
template <class F, class ... Args>
class test
{};
и само задание не хорошо понял...
_SOKOL_ вне форума Ответить с цитированием
Старый 04.02.2013, 00:02   #16
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Сообщение от _SOKOL_ Посмотреть сообщение
в честь чего такие сомнения? как будто это не возможно
для этого я учусь в учебном заведении, за 72 пары легко выучить С++, может перечислить всю программу что прошел?
так как мы только будем начинать учить технологию WinAPI я не представляю что мне делать в консольном режиме, поэтому нет идей
консольный режим вас ничем не ограничивает(в винде точно), просто консольное приложение сразу имеет окно консоли.

да и например ffmpeg это консольное приложение, что ему совсем не мешает быть архиполезным.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 04.02.2013, 00:11   #17
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Granus Посмотреть сообщение
Программа действительно хорошая, я не спорю. Только поймите, этого все равно мало. Без опыта Вы не узнаете очень и очень многого.

А вот Вам задание, если так хочется - напишите шаблонный класс is_callable<F, A1, A2, A3, ... (может быть сколько угодно аргументов)>, у которого есть статический член bool value, который равен true тогда и только тогда, когда объекты типа F можно "вызывать" с аргументами типов A1, A2, A3, ..., т.е. если выражение вида f(a1, a2, a3) определено.
А обязательно вариардик использовать? Может быть просто реализовать поддержку допустим до 7 аргументов максимум?

Количество аргументов редко бывает свыше 7 шт. Макконелл в своей книжке вообще не рекомендует.
А в 2008 студии нет поддержки вариардиков. И там такую задачу невозможно решить в принципе

Зато, если хорошенько подумать, то есть способы как имитировать переменное количество аргументов шаблона, не прибегая к многочисленным перегрузкам.

А статический член bool value лучше заменить на enum { value = true }; или enum { value = false };

Потому что:
1. Так удобнее инициализировать константы времени компиляции.
2. Такие вещи являются шаблонами-алгоритмами. И применяются метапрограммировании на шаблоннах. Использование имеет вид:

Код:
  ...
 enum { is_func =  is_callable<F, A1, A2, A3>::value };
При таком использовании, все что требуется от алгоритма - получить значение времени компиляции. Шаблону просто не нужны никакие данные-члены.


Ну и если бы я и делал такой валидатор, я б немножко изменил дизайн:
enum { is_func = is_callable<F, R(A1, A2, A3)>::value };

Тогда полностью отпадает необходимость в вариардиках. У шаблона только два аргумента:

F - объект, который нужно проверить
R(A1, A2, A3) - это составной тип данных. Он описывает прототип функции.

Принцип действия вот такой:

Код:

#include<iostream>
#inclide<typeinfo>

template<class T> struct View
{
    View() { std::cout<< "TYPE = "<<typeid(T).name()<<std::endl; }
};

int main()
{
    View<void()> view1;  
    View<void(int,int)> view2;
}
Код:
вывод:
TYPE = void __cdecl(void)
TYPE = void __cdecl(int,int)
Я считаю, что такой дизайн лучше потому что:
1. Он удобен и интуитивен.
2. Его проще реализовать. Не нужны никакие вариардики
3. Именно с такой моделью описания прототипа функции работают всякие бустовские бинды и прочее.

Поэтому, можно будет легко подружить с какими нить бустовскими механизмами.

А так вообще да, интересно глянуть, на решение этой задачки парнем, который считает, что выучил великий и непобедимый с++)
_Bers вне форума Ответить с цитированием
Старый 04.02.2013, 00:22   #18
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

_Bers, спасибо за детальное разъяснение) Да, такой синтаксис, пожалуй, удобнее и интуитивнее, если мы хотим проверить конкретную вызываемую сигнатуру. Я имел в виду проверку именно вызова с такими аргументами, не используя тип возвращаемого значения.
Поясните, почему enum { value = true; } лучше, чем static const bool value = true?
Вычисляется тоже во время компиляции, и выглядит интуитивнее, как мне кажется.
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 04.02.2013, 00:22   #19
_SOKOL_
Пользователь
 
Регистрация: 02.02.2013
Сообщений: 44
По умолчанию

что то на примерах с объяснением я лучше учусь чем читая какие то странные статьи....
_SOKOL_ вне форума Ответить с цитированием
Старый 04.02.2013, 00:33   #20
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от _SOKOL_ Посмотреть сообщение
они как то так выглядят?
Вот тебе пример-иллюстрация как работают вариардики.
Заодно можно проверить, поддерживает ли твой компилятор эту абалденную фичу 11 стандарта:

http://liveworkspace.org/code/4coPq$1

Цитата:
Сообщение от _SOKOL_ Посмотреть сообщение
и само задание не хорошо понял...
Вот есть функции, а есть функторы. Функторы, это объекты, у которых есть operator(), поэтому внешне они могут вести себя как функции.

Например:

Код:
struct Functor
{
    void operator(){ std::cout<<"i am functor\n"; }
};

int main()
{
    Functor func;

    func(); //похоже на функцию
}

Ну и вот, твоя задача сделать такой механизм, который сумеет распознать, является ли сущность функтором, или нет.

Причем функтором который работает именно с теми аргументами, которые были указаны.

Пример:

Код:
struct Functor
{
    void operator(){ std::cout<<"i am functor\n"; }
};

void Foo(){ std::cout<<"i am functor\n"; }

void Message(const int val)
{
    if(val==1) std::cout<<"подошла\n";
    else std::cout<<"не подошла\n";
}
int main()
{
    const int val1 = is_callable<Functor, void>::value;
    Message(val1); //вывод: подошла

    const int val2 = is_callable<void (*)(void), void>::value;
    Message(val2);//вывод: подошла

    const int val3 = is_callable<int, void>::value;
    Message(val3);//вывод: не подошла

    //не должна пройти, потому что не совпадает заказанный аргумент
    const int val4 = is_callable<Functor, int>::value;
    Message(val4); //вывод: не подошла


}
_Bers вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
с чего начиНАТЬ С/С++!!!! dk118 Помощь студентам 0 05.12.2012 01:22
С чего начинать leonidsm Свободное общение 4 06.10.2012 19:37
Какой язык лучше всего выбрать после завершения изучения языка Паскаль. VektorAB Помощь студентам 4 09.07.2010 07:16
С чего начинать? Shadol Свободное общение 6 24.11.2009 11:46
С++ ЧЕГО НАЧИНАТЬ !!! geniy Общие вопросы C/C++ 12 03.09.2007 10:50