gpt4 book ai didi

c++ - 模板类和成员函数的部分模板特化

转载 作者:行者123 更新时间:2023-11-28 07:35:40 32 4
gpt4 key购买 nike

自从我对有关部分模板特化的信息进行一些研究以来已经一个小时了。不幸的是,这并不成功..还是找了很多资料,都没有解决我的问题。所以我希望有人能帮助我。


考虑以下最少的代码:

SQL对象.hpp

template<typename T>
class SQLObject
{
public:
template<typename U>
static std::list<T*> filter(const std::string& colum,const std::string& ope,const U& value);
static std::list<T*> filter(const Filter& filter);
}
#include "SQLObject.tpl"

SQL对象.tpl

#include "Filter.hpp"

/* This code do not work, but why ??? */
template<typename T>
template<>
std::list<T*> SQLObject<T>::filter<std::string>(const std::string& colum,const std::string& ope,const std::string& value)
{
// no to_string need whith std::string
return filter(Filter(colum,ope,value));
}

template<typename T>
template<typename U>
std::list<T*> SQLObject<T>::filter(const std::string& colum,const std::string& ope,const U& value)
{
//use to_string with all others types
return filter(Filter(colum,ope,std::to_string(value)));
}

template<typename T>
std::list<T*> SQLObject<T>::filter(const Filter& filter)
{
//some stuff
}

我的问题如下:我无法使用 std::string 专门化过滤器。

所以我尝试了一个简单的重载,但没有成功。所以我求助于您,希望您能帮助我。

最佳答案

简短回答:您不能显式特化未显式特化的类模板的成员模板。

我想按照您的建议使用重载可能是最简单的解决方案:

#include <list>
#include <string>

struct Filter
{
// you constructor...
template < typename... T > Filter(T...){}
};

template<typename T>
class SQLObject
{
public:
template<typename U>
static std::list<T*> filter(const std::string& colum,
const std::string& ope,const U& value);
// v-here-v is the overload
static std::list<T*> filter(const std::string& colum,
const std::string& ope,
const std::string& value);
static std::list<T*> filter(const Filter& filter);
};

// works
template<typename T>
std::list<T*> SQLObject<T>::filter(const std::string& colum,
const std::string& ope,
const std::string& value)
{
// no to_string need whith std::string
return filter(Filter(colum,ope,value));
}

//[...]

但在这种特殊情况下,还有比这更简单的解决方案:

std::string const& to_string(std::string const& p)  {  return p;  }

// class definition etc.

template<typename T>
template<typename U>
std::list<T*> SQLObject<T>::filter(const std::string& colum,
const std::string& ope,const U& value)
{
//use to_string with all others types
using std::to_string;
return filter(Filter(colum,ope,to_string(value)));
}

关于c++ - 模板类和成员函数的部分模板特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16825353/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com