boost :: enable_if отсутствует в сигнатуре функции

Это просто вопрос стиля: мне не нравится способ 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: ошибка: переопределение шаблона void asd ()

СФИНА там сама работает, потому что если я удалю например тот с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>();
}

Я использую материал с ++ 0x вместо boost, потому что до тех пор, пока мне нужен c ++ 0x для использования значений по умолчанию для аргументов шаблона, я не вижу причин использовать boost, который является его предшественником.

Ответы на вопрос(5)

Ваш ответ на вопрос