有没有办法(在 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>
 {
 };