我正在尝试使用SFINAE来为多种类型同时专门化一个结构体模板。我知道像下面这样的东西是可以工作的:
#include <iostream>
template <typename T, typename Enable = void>
struct S {
void operator()() {
std::cout << "Instantiated generic case" << std::endl;
}
};
template<typename T>
using enabled_type = typename std::enable_if<
std::is_same<T, int>::value ||
std::is_same<T, float>::value
>::type;
template <typename T>
struct S<T, enabled_type<T>> {
void operator()() {
std::cout << "Instantiated int/float case" << std::endl;
}
};
int main() {
S<float>()();
return 0;
}
我的问题是,我无法修改S
结构体的主模板以添加typename Enable = void
,因为它是外部头文件库的一部分。因此,主模板将需要像这样:
template <typename T>
struct S {
void operator()() {
std::cout << "Instantiated generic case" << std::endl;
}
};
有没有办法我仍然可以使用SFINAE来专门化此模板?
编辑:请注意,外部库中的代码使用S
结构体,因此我必须实际专门化S
,而不能对其进行子类化。
此外,我正在处理的真实代码要比这个简单示例复杂得多,并且将从SFINAE中受益良多(我有多个模板参数需要针对多种类型组合进行专门化)。
T
表单类型,这可能会有所帮助:https://dev59.com/Fmcs5IYBdhLWcg3wcDeZ#30991097 - bogdan