LINUX.ORG.RU

Любители мета-программирования на С++, обьясните в чем смысл делать шаблон с enable_if используя «if_same» в качестве условия?

 ,


0

1

Завелся у нас в проекте один большой любитель SFINAE, пытался закоммитить буквально нечто подобное в репозиторий:

template < typename T, typename std::enable_if< std::is_same< T, SomeType >::value, int >::type = 0 >
int function(const T& arg) 
{
	...
}

template < typename T, typename std::enable_if< std::is_same< T, int >::value, int >::type = 0 >
int function(const T& arg) 
{
	...
}

Вот какой такой смысл делать это? Чем это лучше можно сказать канонического:

template <typename T> 
int function(const T& arg) = delete;

template <> 
int function<SomeType>(const SomeType& arg)
{
	...
}

template <> 
int function<int>(const int& arg)
{
	...
}

Есть у кого мысли, чем первый вариант реально лучше? Я понимаю, SFINAE в данном случае удобно было бы использовать, если хочется одну реализацию шаблона сделать доступной для списка типов, которые все можно по очереди if_same-нуть. Но для одного единственного типа - это ведь по сути повторяется руками работа компилятора, не?

★★

У вас обоих нужно спросить, зачем вам нужны шаблоны там, где запросто можно обойтись обычной перегрузкой:

int function(const SomeType & arg) {...}
int function(int arg) {...}

eao197 ★★★★★ ()
Ответ на: комментарий от eao197

Ключевой момент тут int, по историческим причинам в случае обычной перегрузки, C++ компилятор много чего к нему автоматом приводит, даже C-строки, когда ищет подходящую перегруженную функцию. В случае с шаблоном этого не происходит.

qrck ★★ ()

Чё посоны

auto f=[&](auto x,auto y){...}

anonymous ()
Ответ на: комментарий от eao197

Ну это в данном случае только. Я такое видел для ситуации, где единственный параметр метода — const char *, а различаются типы результата. И там зачем-то тоже enable_if с is_same использовались.

Там есть какой-то смысл в этом?

i-rinat ★★★★★ ()

Это 14 плюсы. В 17 можно

template <typename T>
int function(const T& arg) 
{
    if constexpr(std::is_same_v<T, ClassString>) {
        ..
    } else if constexpr(std::is_arithmetic_v<T>) {   
        ..
    } else {
        return -1;
    }
}
xpahos ★★★★★ ()
Ответ на: комментарий от xpahos

Вот кстати в таком контексте это да, и выглядит красиво и оправдано.

qrck ★★ ()
Ответ на: комментарий от i-rinat

Ну это в данном случае только.

Вопрос и был про данный случай.

Я такое видел для ситуации, где единственный параметр метода — const char *, а различаются типы результата. И там зачем-то тоже enable_if с is_same использовались.

Я же того кода не видел, мне сложно судить. Более того, из вашего описания не видно даже, куда там enable_if умудрились засунуть.

eao197 ★★★★★ ()
Ответ на: комментарий от eao197

Замените тип аргумента на const int&.

Эм. Разве это как-то поможет?

anonymous ()

Есть у кого мысли, чем первый вариант реально лучше?

Будет работать для метода шаблонного класса. Но тут явно не оно.

anonymous ()

Спасибо ТС что напомнил какие же кресты стремные

upcFrost ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.