Этот вопрос вдохновлен моим предыдущим вопросом Без вывода параметров шаблона из пакета параметров.
Рассмотрим следующий пример кода:
#include <memory>
#include <string>
template<typename... FArgs>
class Callback
{
public:
class Handle{};
};
class BaseCallbackHandle
{
};
using TypeErasedCallbackHandle = std::unique_ptr<BaseCallbackHandle>;
template<typename H>
TypeErasedCallbackHandle makeTypeErasedCallbackHandle( H handle)
{
return {};
}
int main()
{
Callback<int>::Handle h;
std::string s;
makeTypeErasedCallbackHandle(h); //should compile fine
makeTypeErasedCallbackHandle(s); //should raise a compile error
}
См. также http://coliru.stacked-crooked.com/a/5f2a2e816eef6afd.
Шаблон функции makeTypeErasedCallbackHandle
теперь принимает любой класс в качестве входного параметра. Есть ли способ гарантировать (например, с помощью static-assert или enable_if), что только Callback<FArgs...>::Handle
(с любым FArgs
) разрешено как H
? Пример с Callback<int>::Handle
должен скомпилироваться, а std::string
не получится.