【发布时间】:2018-01-22 13:57:09
【问题描述】:
我有一个模板类(我无法修改),我们称它为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 的专业化。
-
这看起来像一个副本:stackoverflow.com/questions/12858839/… 如果它不是一个副本,那么它是一个近亲,你的答案可能就在那里...gcc 4.9.2 和所有
-
@Drt 正如我在 OP 中提到的那样——这个问题是我的出发点——我只是不确定如何根据我的需要调整它。我目前的尝试不适用于 4.9.2。
-
@eddi 顺便说一句,如果您的示例不是真正做作的,则有
std::conditional- 您不需要专门研究这种情况。 -
@LogicStuff 不幸的是我需要专门化,因为
SomeClass用于不同的类(我再次无法更改)以确定在某些复杂的工厂构造逻辑中使用什么类型。跨度>
标签: c++ c++11 templates sfinae