我试图在boost中使用enable_if来进行模板专业化,但是无法让它工作并且混淆如何编写它以及语法实际意味着什么。我已经阅读了提升文档,但对我来说仍然没有意义
我有四种方法,我希望所有人都被命名为相同的东西,并且都非常相似。我有两个函数将返回一个字符串和两个将返回一个整数的函数。 在每种情况下,参数都是int,int,返回类型或int,const char *,返回类型,因为最后一个参数将是可以返回的默认值。
所以这样......
int getVal(int,int,int)
int getVal(int,const char*,int)
string getVal(int,int,string)
string getVal(int,const char*,string)
但这不起作用,因为参数是相同的,只有返回类型不同,我需要它是一个模板化的方法,而不仅仅是一个重载的方法。这是一个非模板类。所以我需要enable_if如果返回类型是字符串或int,或者可能在最后一个参数上检查enable_if?
如果有人能够解释语法的含义并且实际上这样做会有所帮助,那么任何帮助都会受到赞赏。感谢
这是我尝试获取正确语法的众多尝试之一..
template<typename myType>
typename enable_if<boost::is_arithmetic<myType>, myType>::type
GetValue(int row, int col, myType d)
{
unsigned int columnIndex = this->GetColumnIndex(col);
try {
CheckColumnType(col, Integer);
}
catch(DatatableException e){
return d;
}
if("0" == this->m_rows[row][col])
{
return 0;
}
else if("1" == this->m_rows[row][col])
{
return 1;
}
else
{
return atoi(this->m_rows[row][col].c_str());
}
}
template<typename myType>
typename disable_if<boost::is_arithmetic<myType>, myType>::type
GetValue(int row, int col, myType d)
{
unsigned int columnIndex = this->GetColumnIndex(col);
try {
CheckColumnType(col, String);
}
catch(DatatableException e){
return d;
}
return this->m_rows[row][col];
}
template <class T>
T GetValue(int row, typename enable_if<is_arithmetic<!T> >::type* dummy = 0){
{
unsigned int columnIndex = this->GetColumnIndex(col);
try {
CheckColumnType(col, Integer);
}
catch(DatatableException e){
return d;
}
if("0" == this->m_rows[row][col])
{
return 0;
}
else if("1" == this->m_rows[row][col])
{
return 1;
}
else
{
return atoi(this->m_rows[row][col].c_str());
}
}
template <class T>
T GetValue(int row, typename enable_if<is_arithmetic<T> >::type* dummy = 0){
try {
CheckColumnType(col, Integer);
}
catch(DatatableException e){
return d;
}
if("0" == this->m_rows[row][col])
{
return 0;
}
else if("1" == this->m_rows[row][col])
{
return 1;
}
else
{
return atoi(this->m_rows[row][col].c_str());
}
}
答案 0 :(得分:0)
我不确定std::enable_if
是否正在寻找。您是否尝试使用功能模板专业化?
template <typename T>
T function(int number, T const& result = T());
template <>
std::string function(int number, std::string const& result)
{
// implementation for T = std::string
return result;
}
template <>
int function(int number, int const& result)
{
// implementation for T = int
return result;
}
请注意,这需要C ++ 11。默认参数的歧义可以通过明确指定类型来解决,例如int ret = function<int>(1);
。