指针和函数的部分特化

时间:2016-10-12 22:57:15

标签: c++ templates generics specialization

这些是一个较少的方法的模板片段,它将输入两个泛型参数作为输入并返回bool结果

  • 第一个模板是通用的
  • 其次是const char *

  • 的显式特化类型
  • 指针的第三部分特化

如何实现功能的部分专业化?

template<typename T> //general form
class C{
    public: bool isLess(const T& v1, const T& v2){
        return v1<v2;
    }
};

template<> //explicit specialization for char*
class C<const char*>{
public: bool isLess(const char* v1, const char* v2){
    return strcmp(v1,v2) < 0;}
};

template <typename T> //partial specialization for pointers
class C<T*> {
public: bool isLess(T* v1, T* v2){return *v1 < *v2;}
};
//partial specialization for functions?

3 个答案:

答案 0 :(得分:2)

我认为你想要或多或少的东西如下:

 Const c_URL = "https://api.sandbox.paypal.com/v1/oauth2/token"   
 Const c_UserID = "AZxxxxxx" '// Here i put my real Client-ID
 Const c_Secret = "EBxxxxxx" '// Here I put my real Secret
 Const c_Data = "grant_type=client_credentials"

 Dim x_HTTP
 Set x_HTTP = Server.CreateObject("Msxml2.ServerXMLHTTP")

 Call x_HTTP.Open("POST", c_URL, False)
 Call x_HTTP.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")
 Call x_HTTP.setRequestHeader("Accept", "application/json")
 Call x_HTTP.setRequestHeader("Accept-Language", "en_US")
 Call x_HTTP.setRequestHeader("Authorization", "Basic " + Base64Encode(c_UserID + ":" + c_Secret))
 Call x_HTTP.Send(c_Data)

答案 1 :(得分:1)

你没有部分专业化的功能;你所拥有的是重载和std::enable_if<c, T>。提示:对于返回给定std::enable_if<c, T>::type的T的函数,您可以c

答案 2 :(得分:0)

您不需要部分专门化功能模板,因为与类模板不同,您可以使用相同数量的多个功能,即重载。

#include <iostream>
#include <cstring>

template <class T> bool isLess(const T &v1, const T &v2) {
  std::cerr << "general\n";
  return v1 < v2;
}

bool isLess(const char *v1, const char *v2) {
  std::cerr << "str\n";
  return strcmp(v1, v2) < 0;
}

template <typename T> bool isLess(T *v1, T *v2) {
  std::cerr << "pointer\n";

  return *v1 < *v2;
}

int main() {
  int x = 0;
  int y = 1;
  auto s1 = "hey";
  auto s2 = "there";
  std::cerr << isLess(x, y) << "\n";
  std::cerr << isLess(s1, s2) << "\n";
  std::cerr << isLess(&x, &y) << "\n";
}

输出:

general
1
str
1
pointer
1