[英]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_assert
和std::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.