Это просто вопрос стиля: мне не нравится способ C ++ для шаблонного метапрограммирования, который требует, чтобы вы использовали возвращаемый тип или добавили дополнительный фиктивный аргумент для трюков с SFINAE.Итак, идея, которую я придумал, заключается в том, чтобы поместить элемент SFINAE в само определение аргументов шаблона, например:
#include <iostream>
#include <boost/type_traits/is_array.hpp>
#include <boost/utility/enable_if.hpp>
using namespace std;
template <typename T, typename B=typename boost::enable_if< boost::is_array<T> >::type > void asd(){
cout<<"This is for arrays"<<endl;
}
template <typename T, typename B=typename boost::disable_if< boost::is_array<T> >::type > void asd(){
cout<<"This is for NON arrays"<<endl;
}
int main() {
asd<int>();
asd<int[]>();
}
В этом примере g ++ жалуется:
../src/afg.cpp:10:97: ошибка: переопределение 'template void asd ()'
SFINAE там само по себе работает, потому что, если я удалю, например, тот, с disable_if
,ошибка компилятора:
.. / src / afg.cpp: 15: 12: ошибка: нет соответствующей функции для вызова 'asd ()'
то, что я хочу.
Итак, есть ли способ выполнить SFINAE не в «нормальной» сигнатуре функции, то есть тип возвращаемого значения + список аргументов?
РЕДАКТИРОВАТЬ: Это взакончите то, что я собираюсь попробовать в реальном коде:
#include <iostream>
#include <type_traits>
using namespace std;
template <typename T, typename enable_if< is_array<T>::value, int >::type =0 > void asd(){
cout<<"This is for arrays"<<endl;
}
template <typename T, typename enable_if< !is_array<T>::value, int >::type =0 > void asd(){
cout<<"This is for NON arrays"<<endl;
}
int main() {
asd<int[]>();
asd<int>();
}
Я использую материал c ++ 0x вместо boost, потому что, пока мне нужен c ++ 0x для использования значений по умолчанию аргументов шаблона, яне вижу причин использовать boost, который является его предшественником.