断言被调用的函数的签名 return & (reference)
Assert signature of the function that is called to return & (reference)
是否可以通过引用断言我调用 return 的函数类型?
预计断言仅在编译时发生(但不是必需的)。
这对调试很有用。
例子
我有一个简单的 std::vector<T>
封装器,如下所示:-
template<class T> class CustomArray{
//..... some datastructure ...
T& get(int index) { ... }
}
一些 game/business 逻辑可能会使用这个 class 例如
CustomArray<CreditCard> array ;
//... do some business logic
CreditCard& c= array.get(0);
c.pinNumber = 1403; //modification
修改pinNumber影响CustomArray中的值,nice.
如果我的团队中有人想使用他自己的数据结构并编辑我的代码,例如
HisCustomArray<CreditCard> array ;
//replace the line : CustomArray<CreditCard> array
我想要一个自动的weak方法来确保HisCustomArray::get(int)总是return作为T&而不是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)
碰巧 return,您将当场遇到编译错误。
(1) Visual Studio 的编译器有一个扩展,在默认设置中启用,允许它绑定引用到临时值(实际上是右值)。您可以使用 /Za
禁用此扩展
是否可以通过引用断言我调用 return 的函数类型?
预计断言仅在编译时发生(但不是必需的)。
这对调试很有用。
例子
我有一个简单的 std::vector<T>
封装器,如下所示:-
template<class T> class CustomArray{
//..... some datastructure ...
T& get(int index) { ... }
}
一些 game/business 逻辑可能会使用这个 class 例如
CustomArray<CreditCard> array ;
//... do some business logic
CreditCard& c= array.get(0);
c.pinNumber = 1403; //modification
修改pinNumber影响CustomArray中的值,nice.
如果我的团队中有人想使用他自己的数据结构并编辑我的代码,例如
HisCustomArray<CreditCard> array ;
//replace the line : CustomArray<CreditCard> array
我想要一个自动的weak方法来确保HisCustomArray::get(int)总是return作为T&而不是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)
碰巧 return,您将当场遇到编译错误。
(1) Visual Studio 的编译器有一个扩展,在默认设置中启用,允许它绑定引用到临时值(实际上是右值)。您可以使用 /Za