To tylko pytanie o styl: nie podoba mi się sposób C++ do metaprogramowania szablonów, który wymaga użycia typu zwrotnego lub dodania dodatkowego atrapa dla trików z SFINAE . Tak, pomysł wpadłem jest umieścić coś SFINAE w samej definicji argumenty szablonu, tak:boost :: enable_if nie w sygnaturze funkcji
#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[]>();
}
Ten przykład zrobić g ++ skarżyć:
../src/afg.cpp:10:97: error: redefinition of ‘template void asd()’
SFINAE tam sobie działa, ponieważ jeśli usunę na przykład jeden z disable_if
, błąd kompilator:
../src/afg.cpp:15:12: error: no matching function for call to ‘asd()’
co jest, co chcę.
Czy istnieje sposób na zrealizowanie SFINAE nie w "normalnym" sygnaturze funkcji, to jest typ zwracany + lista argumentów?
EDIT: To jest w końcu to, co mam zamiar spróbować w rzeczywistym kodu:
#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>();
}
używam C++ 0x rzeczy zamiast doładowania bo jak długo muszę C++ 0x dla użycia domyślnych argumentów szablonu, nie widzę powodu, aby używać boost, który jest jego prekursorem.
wow, nie wiedziałem, że nawet typ szablonu może być dynamiczny! Nie akceptuję twojej odpowiedzi ponieważ najpierw muszę sprawdzić, czy ta sztuczka może mieć zastosowanie do mojego kodu, ale jestem pewien, że tak. –