К примеру, с помощью SFINAE (если вы принимаете решение на C++ 11)
#include <iostream>
#include <type_traits>
template <typename>
struct protocol_1
{ };
template <typename>
struct protocol_2
{ };
template<typename device, template<typename> class protocol>
class MyClass
{
public:
template<typename select, typename p = protocol<device>>
typename std::enable_if<
std::is_same<p, protocol_1<device>>::value, bool>::type
method()
{ return true; }
template<typename select, typename p = protocol<device>>
typename std::enable_if<
std::is_same<p, protocol_2<device>>::value, bool>::type
method()
{ return false; }
};
int main()
{
MyClass<int, protocol_1> m1;
MyClass<int, protocol_2> m2;
std::cout << m1.method<int>() << std::endl; // print 1 (true)
std::cout << m2.method<void>() << std::endl; // print 0 (false)
}
--- EDIT ---
Как указано на Yakk (спасибо!), Это решение является слабым, потому что используется значение по умолчанию шаблона, которое может быть раскрыто и распространено.
Пример; с
MyClass<int, protocol_1>{}.method<void>();
называется "protocol_1" версия method()
, используя значение по умолчанию для p
; но explciting p
следующим
MyClass<int, protocol_1>{}.method<void, protocol_2<int>>();
называется «protocol_2» версию method()
над istance из в MyClass
на основе protocol_1
Чтобы избежать этой проблемы можно добавить static_assert()
, как в версии method()
, чтобы проверить и налагают, что p
равно значению по умолчанию (protocol<device>
)
Я имею в виду ... как последовать
template<typename select, typename p = protocol<device>>
typename std::enable_if<
std::is_same<p, protocol_1<device>>::value, bool>::type
method()
{
static_assert(std::is_same<p, protocol<device>>::value, "!");
return true;
}
template<typename select, typename p = protocol<device>>
typename std::enable_if<
std::is_same<p, protocol_2<device>>::value, bool>::type
method()
{
static_assert(std::is_same<p, protocol<device>>::value, "!");
return false;
}
Так
MyClass<int, protocol_1>{}.method<void, protocol_2<int>>();
генерировать ошибку компилятора.
Обратите внимание, что этот подход очень хрупкий, поскольку, если тела действительны только в предположении, никто не проходит шаблонный аргумент 2, вы получаете плохо сформированную программу, для которой не требуется диагностика. Что еще хуже, компилятор не диагностирует проблему; ваш код будет работать отлично. – Yakk
@skyp поиск «нет необходимости диагностики», в стандарте есть только дюжина или около того. Один о шаблонах должен иметь действительные специализации (что означает что-то другое в стандарте, чем разговорное) – Yakk
@Yakk. Спасибо. – skypjack