3

我试图在 boost 中使用 enable_if 来进行模板专业化,但无法让它工作并且对如何编写它以及语法的实际含义感到困惑。我已经阅读了 boost 文档,但对我来说仍然不太有意义

我有四种方法,我希望它们都被命名为相同的东西并且都非常相似。我有两个返回字符串的函数和两个返回整数的函数。在每种情况下,参数都是 int,int,return 类型或 int,const char*,return 类型,因为最后一个参数将是可以返回的默认值。

所以像这样的东西......

int getVal(int,int,int)
int getVal(int,const char*,int)
string getVal(int,int,string)
string getVal(int,const char*,string)

但这不起作用,因为参数是相同的,只有返回类型不同,我需要它是一个模板化的方法,而不是一个重载的方法。这是在一个非模板类中。所以如果返回类型是字符串或整数,我需要 enable_if,或者检查最后一个参数的 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());
            }
    }
4

1 回答 1

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);.

于 2012-10-17T13:12:53.493 回答