[英]how to use boost::enable_if in class template
我正在嘗試使用boost :: enable_if來打開/關閉類模板中的某些功能,但始終會收到編譯錯誤錯誤:struct boost :: enable_if中沒有名為“ type”的類型 。
我的片段:
#include <iostream>
#include <tr1/type_traits>
#include <boost/utility.hpp>
namespace std {
using namespace tr1;
}
template <typename T1>
struct C {
template< typename T2 >
void test( T2&, typename boost::enable_if<
std::is_const< T1 >, T1 >::type* = 0 ) {
std::cout << "const" << std::endl;
}
template< typename T2 >
void test( T2&, typename boost::disable_if<
std::is_const< T1 >, T1 >::type* = 0 ) {
std::cout << "non-const" << std::endl;
}
};
int main() {
const int ci = 5;
int i = 6;
C<char> c;
c.test(ci);
c.test(i);
return 0;
}
但是以下類似代碼可以正常工作:
#include <iostream>
#include <tr1/type_traits>
#include <boost/utility.hpp>
namespace std {
using namespace tr1;
}
template <typename T1>
struct C {
template< typename T2 >
void test( T2&, typename boost::enable_if<
std::is_const< T2 >, T1 >::type* = 0 ) {
std::cout << "const" << std::endl;
}
template< typename T2 >
void test( T2&, typename boost::disable_if<
std::is_const< T2 >, T1 >::type* = 0 ) {
std::cout << "non-const" << std::endl;
}
};
int main() {
const int ci = 5;
int i = 6;
C<char> c;
c.test(ci);
c.test(i);
return 0;
}
我要實現的是基於類模板中聲明的類型來禁用/啟用某些成員函數。 實際上,不需要模板成員函數。 僅為SFINAE添加了它們。
任何人都可以幫忙嗎?
謝謝!
SFINAE (用於實現enable_if
的機制)僅在功能模板的模板參數的上下文中起作用。 在您的情況下, T1
是封閉類模板的模板參數,而不是功能模板本身的模板參數。 從功能模板的角度來看,它是固定類型,不能按照聲明中的拼寫方式使用它是正常錯誤,而不是替代失敗。
一種方法是類本身的專用化,如果您只想對某些功能執行此操作,則可以將其作為基類:
template <typename T1>
struct B {
template<typename T2>
void test( T2& ) {
std::cout << "non-const" << std::endl;
}
};
template <typename T1>
struct B< const T1 > {
template<typename T2>
void test( T2& ) {
std::cout << "const" << std::endl;
}
};
template <typename T1>
struct C : B<T1> {
//...
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.