Нашёл в сети workaround:
#include <iostream>
struct FirstSelector {};
struct SecondSelector {};
struct Foo {};
template <typename T>
struct Bar
{
template <typename U, typename U2 = void>
struct Nested;
template <typename U2>
struct Nested<FirstSelector, U2>
{
void test();
};
template <typename U2>
struct Nested<SecondSelector, U2>
{
void test();
};
Nested<FirstSelector> m_first;
Nested<SecondSelector> m_second;
void test()
{
m_first.test();
m_second.test();
}
};
template <typename T> template <typename U2>
void Bar<T>::Nested<FirstSelector, U2>::test()
{
std::cout << "first" << std::endl;
}
template <typename T> template <typename U2>
void Bar<T>::Nested<SecondSelector, U2>::test()
{
std::cout << "second" << std::endl;
}
int main(int argc, char *argv[])
{
Bar<Foo> bar;
bar.test();
return 0;
}
Но имхо это выглядит довольно криво.
Курица — это инструмент, с помощью которого одно яйцо производит другие.