我有一個模板類(我無法修改),我們將其稱爲SomeClass
,我想專門針對僅從特定類派生的類。在this answer之後,我能夠在gcc 6.3.1中做到這一點,但是不幸的是我需要在gcc 4.9.2中做到這一點,並且在編譯時失敗,說「部分專業化SomeClass<T>
沒有專門化任何模板參數」。派生類的模板專業化
有沒有什麼辦法可以改變下面,讓它與gcc 4.9.2一起工作?
#include <iostream>
#include <string>
using namespace std;
struct A {
string name() { return "A"; }
};
struct B : A {
string name() { return "B"; }
};
struct C {
string name() { return "C"; }
};
template<typename T, typename = std::enable_if_t<std::is_base_of<A, T>::value>>
using enable_if_a = T;
template<typename T>
struct SomeClass {
using Type = T;
};
template<typename T>
struct SomeClass<enable_if_a<T>>
{
using Type = A;
};
int main(int, char**)
{
SomeClass<A>::Type el1;
SomeClass<B>::Type el2;
SomeClass<C>::Type el3;
cout << el1.name() << "," << el2.name() << "," << el3.name() << endl;
}
輸出:
A,A,C
@AndyG如果我沒有專注,我會得到「A,B,C」。我想要專門爲A和B. – eddi
這看起來像這樣的副本:https://stackoverflow.com/questions/12858839/using-sfinae-for-template-class-specialisation如果它不是重複的,那麼它是一個近親,你的答案可能是... gcc 4.9.2和所有 –
@Drt正如我在OP中提到的那樣 - 這個問題是我的出發點 - 我只是不確定如何適應我的需求。我目前的嘗試不適用於4.9.2。 – eddi