断言被调用函数的签名返回& (参考)

时间:2016-06-06 05:29:02

标签: c++ debugging pass-by-reference c++14 assert

是否可以断言我通过引用返回的函数的类型?

断言预计仅在编译时发生(但不是必需的)。

它对于调试目的很有用。

实施例

我有一个简单的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 ....

2 个答案:

答案 0 :(得分:3)

您可以使用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 :(得分: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)

停用此扩展程序