對不起,誤導您在最近的答案,我想了一會兒,它會更簡單。所以我會盡力在這裏提供一個完整的解決方案。一般的方法來解決這一類的問題是寫一個特質幫手模板,並與enable_if
一起使用(無論是C++ 11,升壓或手動執行)來決定的一類專業化:
特質
一個簡單的方法,不一定是最好的,但簡單的寫的是:
template <typename T>
struct has_nested_Vec {
typedef char yes;
typedef char (&no)[2];
template <typename U>
static yes test(typename U::Vec* p);
template <typename U>
static no test(...);
static const bool value = sizeof(test<T>(0)) == sizeof(yes);
};
方法很簡單,提供兩個模板功能,即返回類型不同的尺寸。其中一個採用嵌套Vec
類型,另一個採用省略號。對於嵌套Vec
的所有類型,第一個重載是更好的匹配(省略號是任何類型的最差匹配)。對於那些沒有嵌套的類型Vec
SFINAE將丟棄該過載,剩下的唯一選項將是省略號。所以現在我們有一個特徵來問是否有嵌套的Vec
類型。
啓用如果
你可以使用這個從任何庫,或者你可以滾你自己,這是很簡單的:
template <bool state, typename T = void>
struct enable_if {};
template <typename T>
struct enable_if<true,T> {
typedef T type;
};
當第一個參數是false
,基本模板唯一的選擇,並且沒有嵌套的type
,如果條件是true
,那麼enable_if
有嵌套的type
,我們可以使用SFINAE。
實施
現在,我們需要提供的模板,將使用SFINAE只有那些類型的嵌套Vec
專業化:
template<class T, class V = void>
struct Functor {
void operator()() const {
std::cerr << "general" << std::endl;
}
};
template<class T>
struct Functor<T, typename enable_if<has_nested_Vec<T>::value>::type > {
void operator()() const {
std::cerr << "special" << std::endl;
}
};
每當我們實例Functor
一個類型,編譯器會嘗試使用專門化,它將依次實例化has_nested_Vec
並獲得一個真值,傳遞給enable_if
。對於那些值爲false
,enable_if
的類型沒有嵌套的type
類型,所以在SFINAE中專用化將被丟棄,並且將使用基本模板。
你的具體情況
你的具體情況,在那裏看來你真的不需要專門整個類型只是運營商,你可以混合的三個要素到一個單一的一種: Functor
一個分派到的基礎上,Vec
存在兩個內部模板的功能之一,除去enable_if
的需求和特性類:
template <typename T>
class Functor {
template <typename U>
void op_impl(typename U::Vec* p) const {
std::cout << "specialized";
}
template <typename U>
void op_impl(...) const {
std::cout << "general";
}
public:
void operator()() const {
op_impl<T>(0);
}
};
刪除了'compiler'標籤,它通常用於編譯過程本身的問題,而這個問題是關於C++的語言。 –