Почему SFINAE применяется только к одной из этих двух, казалось бы, идентичных функций?

Из Получить таблицу и индекс DDL простым способом :

set heading off;
set echo off;
Set pages 999;
set long 90000;

spool ddl_list.sql

select dbms_metadata.get_ddl('TABLE','DEPT','SCOTT') from dual;

select dbms_metadata.get_ddl('INDEX','DEPT_IDX','SCOTT') from dual;

spool off;

0
задан D0SBoots 1 March 2019 в 22:15
поделиться

1 ответ

Здесь СФИНА не происходит. Все вызовы DoStuff будут вызывать

template <typename T, typename...>
void DoStuff(T input) {
    input.bar();
}

. Причина этого в том, что

template <typename T, typename>
void DoStuff(T input) {
    input.foo();
}

требуется два параметра шаблона, в то время как

template <typename T, typename...>
void DoStuff(T input) {
    input.bar();
}

работает для 1 или более параметров шаблона (пустые пакеты могут быть пустыми). Поэтому, когда вы звоните

DoStuff(Foo());
// or
DoStuff(Bar());
//or
DoStuff(Both());

, вы можете вывести только один параметр шаблона, и единственным жизнеспособным кандидатом является

template <typename T, typename...>
void DoStuff(T input) {
    input.bar();
}

Если вы использовали

DoStuff<Foo, any_other_type>(Foo());

, то вы получите ошибку неоднозначности, так как она соответствует обоим шаблонам.

0
ответ дан NathanOliver 1 March 2019 в 22:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: