Это всего лишь вопрос о стиле: мне не нравится способ C++ для метапрограммирования шаблонов, который требует использования возвращаемого типа или добавления дополнительного фиктивного аргумента для трюков с помощью SFINAE , Таким образом, идея, которую я придумал, чтобы поставить SFINAE вещь в самом определении аргументов шаблона, например:boost :: enable_if not in function signature
#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[]>();
}
В этом примере сделать г ++ жалуются:
../src/afg.cpp:10:97: error: redefinition of ‘template void asd()’
SFINAE там сам работает, потому что если удалить, например, один с disable_if
, ошибка компилятора:
../src/afg.cpp:15:12: error: no matching function for call to ‘asd()’
что я и хочу.
Итак, есть ли способ выполнить SFINAE не в «нормальной» сигнатуре функции, то есть в виде возвращаемого типа + список аргументов?
EDIT: Это в конце концов, что я собираюсь попробовать в реальном коде:
#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 материал вместо повышения, потому что до тех пор, как мне нужно, C++ 0x для использования аргументов шаблонов по умолчанию, я не вижу причин использовать boost, который является его предшественником.
wow, я не знал, что даже тип шаблона может быть динамическим! Не принимаем ваш ответ еще потому что сначала я должен проверить, что этот трюк может применяться к моему коду, но я уверен, что так оно и будет. –