有没有办法(在 C++ 中)创建一个实现某些功能的模板 class?
Is there a way(in C++) to create a template class that implements certain functions?
我想创建一个只接受特定类型模板 class 的 class。我知道存在模板专业化,但我希望我的 class 接受所有实现特定功能搜索的模板。
假设我有一个 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
};
基本上,我想创建一个适用于所有具有搜索功能的 class 的通用 class。有办法吗?
I want to create a generic class that works for all classes that have the search functionality. Is there a way to do this?
举例,使用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>
{
};
我想创建一个只接受特定类型模板 class 的 class。我知道存在模板专业化,但我希望我的 class 接受所有实现特定功能搜索的模板。
假设我有一个 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
};
基本上,我想创建一个适用于所有具有搜索功能的 class 的通用 class。有办法吗?
I want to create a generic class that works for all classes that have the search functionality. Is there a way to do this?
举例,使用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>
{
};