簡體   English   中英

如何使用enable_if和模板專業化c ++?

[英]How to use enable_if and template specialization c++?

我試圖在boost中使用enable_if進行模板特化,但是無法使它工作並且如何編寫它以及語法實際意味着什么。 我已經閱讀了增強文檔,但對我來說仍然沒有意義

我有四種方法,我希望所有人都被命名為相同的東西,都非常相似。 我有兩個函數將返回一個字符串和兩個將返回一個整數的函數。 在每種情況下,參數都是int,int,return type或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());
            }
    }

我不確定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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM