簡體   English   中英

專門研究模板成員函數[SFINAE]

[英]specialize template member function [SFINAE]

基於問題和“ Dave”提供的答案,如何專門處理非整數類型以處理類型為QDate (在Qt中用於處理與日期相關的任務)?

我要專門研究的功能是:

void extract(const std::string str)
{
        std::bitset<sizeof(T) * CHAR_BIT> bs(str.substr(m_start, m_len));
        m_data = static_cast<T>(bs.to_ulong());
}

一個1和0的std::string提供給該函數,然后根據開始和長度,我需要將其轉換為實例化包含此函數的模板類的類型。 當類型不是整數或無法使用std::bitset生成時,這沒有意義。

我不確定我是否完全理解您的用例,但我認為這與

template<typename T>
struct foo
{
    T m_data;
    // others ...

    void extract(const std::string str)
    {
        std::bitset<sizeof(T) * CHAR_BIT> bs(str.substr(m_start, m_len));
        m_data = static_cast<T>(bs.to_ulong());
    }
};

但是,當QDate實例化foo時,您希望extract可以做一些不同的事情。 有幾種不同的方法可以做到這一點,SFINAE就是其中一種。

但你不能簡單地釘在一個enable_if表達式來extract ,因為SFINAE工作替換故障需要立即背景下發生的,並且T由時間稱為 foo<T>::extract被實例化。 因此,添加一個虛擬模板參數以extract默認為T參數。

template<typename U=T>
typename std::enable_if<std::is_same<U, QDate>::value>::type
    extract(const std::string str)
{
  // this will be used when T=QDate
}


template<typename U=T>
typename std::enable_if<!std::is_same<U, QDate>::value>::type
    extract(const std::string str)
{
  // this will be used when T!=QDate
}

如果extract是改變行為的唯一方法,那么完成此操作的另一種方法是將所有通用功能移至foo將繼承的另一個類。

template<typename T> 
struct foo_base
{
  // common functionality
};

template<typename T>
struct foo : foo_base<T>
{
  void extract(const std::string str)
  {
    std::bitset<sizeof(T) * CHAR_BIT> bs(str.substr(m_start, m_len));
    m_data = static_cast<T>(bs.to_ulong());
  }
};

// Specialization for QDate
template<>
struct foo<QDate> : foo_base<QDate>
{
  void extract(const std::string str)
  {
    // QDate specific functionality
  }
};

暫無
暫無

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

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