是否可以断言我通过引用返回的函数的类型?
断言预计仅在编译时发生(但不是必需的)。
它对于调试目的很有用。
我有一个简单的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&amp;不是T,否则该线将被破坏。
c.pinNumber = 1403;
我期待类似的东西:
CustomArray<CreditCard> array ;
assertReturn_JUST_DUMMY( array::get(int) , CreditCard& ); //possible format
//.... other business logic ....
答案 0 :(得分:3)
您可以使用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 :(得分:2)
您实际上并不需要做任何事情(除了使用符合标准的编译器(1))。 C ++不允许您将非/usr/local/bin/php -q /home/username/public_html/forum/cron.php >> /home/username/cron.log 2>&1
引用绑定到临时。所以使用此代码:
const
如果CreditCard& c= array.get(0);
c.pinNumber = 1403; //modification
碰巧按值返回,您将立即得到编译错误。
(1) Visual Studio的编译器有一个扩展,在默认设置中启用,允许它绑定对temporaries(实际上为rvalues)的引用。您可以使用array.get(0)