SFINAE + sizeof = определить, компилируется ли выражение

StackOverflow https://stackoverflow.com/questions/2127693

  •  22-09-2019
  •  | 
  •  

Вопрос

Я только что узнал, как проверить, operator<< предоставляется для типа.

template<class T> T& lvalue_of_type();
template<class T> T  rvalue_of_type();

template<class T>
struct is_printable
{
    template<class U> static char test(char(*)[sizeof(
        lvalue_of_type<std::ostream>() << rvalue_of_type<U>()
    )]);
    template<class U> static long test(...);

    enum { value = 1 == sizeof test<T>(0) };
    typedef boost::integral_constant<bool, value> type;
};

Хорошо ли известен этот трюк, или я только что получил Нобелевскую премию по метапрограммированию?;)

РЕДАКТИРОВАТЬ:Я упростил код для понимания и адаптации с помощью двух объявлений шаблонов глобальных функций. lvalue_of_type и rvalue_of_type.

Это было полезно?

Решение

Боюсь, это хорошо известная техника :-)

Использование вызова функции в sizeof Оператор инструктирует компилятор выполнить вывод аргументов и сопоставление функций, конечно, во время компиляции.Кроме того, с помощью функции шаблона компилятор также создает экземпляр конкретной функции из шаблона.Однако это выражение не вызывает генерацию вызова функции.Это хорошо описано в СФИНАЕ Соно Буони PDF.

Проверить другие Примеры C++ SFINAE.

Другие советы

Это всего лишь комбинация двух известных приемов.SFINAE говорит: «Ошибка замены не является ошибкой» — вы именно это и сделали.С использованием sizeof Также часто встречается возможность позволить компилятору подставлять аргументы шаблона в выражение без его фактического выполнения.

Извини :-)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top