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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.01.2016, 22:00   #1
OktXIV
Пользователь
 
Регистрация: 16.02.2013
Сообщений: 18
По умолчанию Определение наличия метода с данным именем и сигнатурой на этапе копиляции

Прочитал это:
http://habrahabr.ru/post/205772/

Код:
template<typename T> struct has_foo{
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;
};
Это шаблон определения наличия в типе метода "void foo(int)", работает хорошо, но также срабатывает на функции с сигнатурой "void foo(long)", "void foo(float)" и т.д.
Работает в случае если тип наследуется от типа с искомой функцией, например:

Код:
struct A
{
void foo(int)
}; struct B : public A{};
has_foo<B>::value будет равен true.

А вот другой шаблон из статьи:

Код:
template<typename T> struct has_foo
{
private:
    template <typename U, void(U::*pfn)(int) = &U::foo>
    struct detector {char _[2];};

    static char detect(...);
    template<typename U> static detector<U> detect(U*);
public:
    static const bool value = sizeof(detect(static_cast<T*>(0))) != sizeof(char);
};
Этот определяет метод точно "void foo(int)", на "void foo(long)" выдаст false. Но в случае с наследованием (has_foo<B>::value) не срабатывает, value = false.

нужен шаблон, работающий в обоих случаях: точно определяющий сигнатуру и срабатывающий при наследовании. Естественно всё на этапе компиляции.
OktXIV вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
проверка наличия папки с именем зависящим от сисстемной даты из X.bat vova_ Помощь студентам 2 21.09.2012 17:59
Вопрос с сигнатурой egorzenit Общие вопросы Delphi 6 05.07.2011 16:11
Создать файл целых чисел с данным именем и записать в него N первых положительных четных чисел prelest' Паскаль, Turbo Pascal, PascalABC.NET 4 01.06.2011 10:27
определение наличия звуковой карты ohos Win Api 2 26.03.2011 13:22
Определение наличия com порта yulia Общие вопросы Delphi 17 25.04.2009 23:36