boost :: enable_if não está na assinatura da função

Esta é apenas uma pergunta sobre estilo: eu não gosto da maneira de C ++ para metaprogramação de modelos que exige que você use o tipo de retorno ou adicione um argumento fictício extra para os truques com SFINAE. Então, a ideia que tive foi colocar a coisa SFINAE na própria definição de argumentos do modelo, assim:

#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[]>();
}

Este exemplo faz o g ++ reclamar:

.. / src / afg.cpp: 10: 97: erro: redefinição de "template void asd ()"

SFINAE aí funciona, porque se eu excluir por exemplo aquele comdisable_if, o erro do compilador é:

.. / src / afg.cpp: 15: 12: erro: nenhuma função correspondente para a chamada para 'asd ()'

Qual é o que eu quero.

ntão, existe uma maneira de realizar SFINAE não na assinatura "normal" de uma função, que é o tipo de retorno + lista de argumento

EDIT: É no final o que vou tentar no código real:

#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>();
}

Eu uso material c ++ 0x em vez de boost porque, desde que eu precise de c ++ 0x para usar padrões de argumentos de modelo, não vejo razão para usar boost, que é seu precurso

questionAnswers(5)

yourAnswerToTheQuestion