簡體   English   中英

C ++中的編譯時條件成員函數調用

[英]compile-time conditional member function call in C++

我有一個模板類,僅當模板參數滿足某些條件時,某些成員函數才有意義。 例如,使用std::enable_if<>我只能為這些情況定義它們,但是如何有條件地調用它們呢? 這是一個簡單的例子

template<class T> class A
{
   typename std::enable_if<std::is_floating_point<T>::value>::type a_member();
   void another_member()
   {
     a_member(); // how to restrict this to allowed cases only?
   }
};

首先,您不能像這樣使用SFINAE-模板類型參數必須位於函數而非類上。

完整的解決方案如下所示:

template<class T> class A
{
private:
   template <class S>
   typename std::enable_if<std::is_floating_point<S>::value>::type a_member() {
       std::cout << "Doing something";
   }

   template <class S>
   typename std::enable_if<!std::is_floating_point<S>::value>::type a_member() {
       //doing nothing
   }

public:
   void another_member()
   {
     a_member<T>();
   }
};


int main() {
    A<int> AInt;
    AInt.another_member();//doesn't print anything

    A<float> AFloat;
    AFloat.another_member();//prints "Doing something"
}

警告:這是我沒有嘗試過的完整的,可怕的技巧,可能永遠無法起作用。

嘗試將其添加到類聲明中:

typename std::enable_if<std::is_floating_point<T>, int*>::type a_enabled_p() { return 0;};
void another()
{
  if((a_enabled_p()+1)==1)
  {
    //Not enabled
  }
  else if((a_enabled_p()+1)==sizeof(int))
  {
    //Is enabled
  }
}

這就是這種恐怖可能起作用的原因。 如果它們是浮點數,則謂詞的返回值為int* 如果它們是,則沒有typedef,它默認為int (我希望)。 當您將1加到int* ,實際上就是在添加sizeof(int) 將1加到int會加1。 這意味着通過檢查加一的值,我們知道。

注意:請勿使用此功能。 提出來很有趣,但以上答案是MUCH,MUCH

許多

更好。 不要使用這個。 請。

暫無
暫無

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

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