Đây chỉ là một câu hỏi về phong cách: Tôi không thích cách của C++ cho mẫu lập trình meta yêu cầu bạn sử dụng kiểu trả về hoặc thêm một đối số giả cho các thủ thuật với SFINAE . Vì vậy, ý tưởng tôi đã đưa ra là đặt điều SFINAE trong các đối số mẫu định nghĩa riêng của mình, như thế này: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[]>();
}
Ví dụ này làm g ++ phàn nàn:
../src/afg.cpp:10:97: error: redefinition of ‘template void asd()’
SFINAE có bản thân công trình, bởi vì nếu tôi xóa ví dụ số có disable_if
, lỗi trình biên dịch là:
../src/afg.cpp:15:12: error: no matching function for call to ‘asd()’
Tôi muốn gì.
Vì vậy, có cách nào để hoàn thành SFINAE không có chữ ký "bình thường" của một hàm không, đó là danh sách đối số kiểu trả về?
EDIT: Đây là cuối cùng những gì tôi sẽ cố gắng trong mã thực:
#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>();
}
tôi sử dụng C++ 0x thứ thay vì thúc đẩy bởi vì chừng nào tôi cần C++ 0x để sử dụng mặc định của đối số mẫu, tôi thấy không có lý do gì để sử dụng tăng, đó là tiền thân của nó.
wow, tôi không biết rằng ngay cả loại mẫu có thể là động! Không chấp nhận câu trả lời của chúng tôi bởi vì tôi phải kiểm tra trước rằng thủ thuật này có thể áp dụng cho mã của tôi, nhưng tôi khá chắc chắn nó sẽ. –