Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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


Ответ
 
Опции темы
Старый 19.08.2014, 18:29   #1
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию [с++, SFINAE] is_complete

Всем привет!
Нужно сделать детектилку времени компиляции : является ли тип неполным.

Я себе уже голову сломал. Гугл молчит (точнее там конечно болванок немерено, но все они примитивные и мой тест не прошли).


В кратце суть:

http://rextester.com/SZYG98724

Код:
#include <iostream>

template <typename T> struct is_complete_helper 
{
    template <typename U>
        static auto test( U*, bool dummy=sizeof(U)) -> std::true_type;        
        
    static auto test(...) -> std::false_type;

    using type = decltype(test( (T*)0 ) );
    
};

template <typename T>
    struct is_complete : is_complete_helper<T>::type {};


struct some;

typedef std::pair<int,some> Pair;

int main()
{
    std::cout << is_complete<Pair>::value << std::endl; 
}
Здесь нафиг вылетает sfinae.
Единственная идея, которую я смог придумать - это пропасти, что если исследуемый тип - шаблон, тогда пропасти неполность всех его формальных параметров.

Конкретно для std:air это сработает. Но заваливает следующий тест:

...
Код:
struct some;

template<class T> agregat{};

typedef agregat<some> rabbit;   //<--- полный тип, несмотря на то, что параметр шаблона не полный

int main()
{
    //<--- реализацию is_complete для теста параметров не привожу - много буковок, все равно она тест провалила

    std::cout << is_complete<rabbit>::value << std::endl; //<--- ошибка: из-за того, что параметр T оказался не полным посчитала всего кролика не полным.
}

Нужны идеи.
_Bers вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Почему не работает SFINAE Granus Общие вопросы C/C++ 0 23.09.2012 12:03