我想创建一个只接受某些类型的模板类的类。我知道存在模板特化,但我希望我的类接受实现特定功能的所有模板,搜索。
我们假设我有class A
如下:
template<class T> //add a restriction that T implements bool search(T)
class A
{
T t;
//do something that uses T.search(T x)
if(t.search(x))
//Do something
};
基本上,我想创建一个适用于所有具有搜索功能的类的泛型类。有没有办法做到这一点?
答案 0 :(得分:2)
我想创建一个适用于具有搜索功能的所有类的泛型类。有没有办法做到这一点?
例如,使用decltype()
如下
template <typename T,
typename = decltype(std::declval<T>().search(std::declval<T>()))>
class A
{
};
以下是size()
已启用class A
#include <string>
#include <type_traits>
template <typename T, typename = decltype(std::declval<T>().size())>
class A
{
};
int main()
{
A<std::string> as;
//A<int> ai; // compilation error
}
此解决方案存在一个缺点:您可以劫持它,解释第二个模板参数;例如,以下代码编译
A<int, void> ai;
要避免此问题,您可以按如下方式使用部分特化
template <typename T,
typename = decltype(std::declval<T>().search(std::declval<T>()))>
class A;
template <typename T>
class A<T>
{
};