簡體   English   中英

斷言被調用函數的簽名返回&(引用)

[英]Assert signature of the function that is called to return & (reference)

是否可以斷言我調用通過引用返回的函數的類型?

預計斷言僅在編譯時發生(但不是必需的)。

它對於調試目的很有用。

我有一個簡單的std::vector<T>封裝器如下: -

template<class T> class CustomArray{
    //..... some datastructure ...
    T& get(int index) { ... }
}

一些游戲/商業邏輯可以使用這個類,例如

CustomArray<CreditCard> array ;
//... do some business logic
CreditCard& c= array.get(0);
c.pinNumber = 1403; //modification

修改pinNumber會影響CustomArray中的值,很好。

如果我團隊中的某個人想要使用他自己的數據結構並編輯我的代碼,例如

HisCustomArray<CreditCard> array ;
//replace the line : CustomArray<CreditCard> array 

我想要一種自動弱的方法來確保HisCustomArray :: get(int)始終以T&not T的形式返回,否則該行將被破壞。

 c.pinNumber = 1403;

我期待類似的東西:

CustomArray<CreditCard> array ;
assertReturn_JUST_DUMMY(   array::get(int)  , CreditCard& ); //possible format
//.... other business logic ....

您可以使用static_assertstd::is_reference來獲取您要查找的內容。

例:

#include <type_traits>

template<class T> class CustomArray{
   public:
    T& get(int index) {return data;}
    T data;
};

template<class T> class HisCustomArray{
   public:
    T get(int index) {return data;}
    T data;
};

struct CreditCard {};

int main()
{
   CustomArray<CreditCard> array1;
   static_assert(std::is_reference<decltype(array1.get(0))>::value,
                 "Need a reference returning function.");
   CreditCard& c1 = array1.get(0);

   HisCustomArray<CreditCard> array2;
   static_assert(std::is_reference<decltype(array2.get(0))>::value,
                 "Need a reference returning function.");
}

編譯器在編譯時為array2執行斷言。

來自g ++ 4.8.4的錯誤消息:

socc.cc: In function ‘int main()’:
socc.cc:24:4: error: static assertion failed: Need a reference returning function.
    static_assert(std::is_reference<decltype(array2.get(0))>::value, "Need a reference returning function.");

您實際上不需要做任何事情(除了使用符合標准的編譯器(1) )。 C ++不允許您將非const引用綁定到臨時。 所以用這個代碼:

CreditCard& c= array.get(0);
c.pinNumber = 1403; //modification

如果array.get(0)碰巧按值返回,您將立即獲得編譯錯誤。


(1) Visual Studio的編譯器有一個擴展,在默認設置中啟用,允許它綁定對temporaries(實際上為rvalues)的引用。 您可以使用/Za禁用此擴展程序

暫無
暫無

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

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