Я пытаюсь специализировать шаблон структуры для нескольких типов одновременно, используя SFINAE. Я знаю, что-то вроде следующих работ:Использование частичной специализации 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 специализироваться этот шаблон?
Edit: Обратите внимание, что S
структура используется код во внешней библиотеке, так что я есть на самом деле специализируются S
и не может его подкласса. Кроме того, реальный код, над которым я работаю, намного сложнее и выиграет от SFINAE намного больше, чем этот простой пример (у меня есть несколько параметров шаблона, которые должны быть специализированы для всех комбинаций нескольких типов).
В зависимости от того, какие фактические формы 'T' вас интересуют, это может помочь: https://stackoverflow.com/a/30991097/4326278 – bogdan