仅当指针不是 nullptr 时才调用方法
Call method only if pointer is not nullptr
我有一个接口类和一个指针,可能nullptr
,如果是,我只是跳过方法调用:
if (ptr != nullptr)
{
ptr->SomeMethod();
}
...
if (ptr != nullptr)
{
ptr->SomeOtherMethod();
}
...
if (ptr != nullptr)
{
ptr->SomeMethodThatWasntMentionedBefore();
}
更新:以下不太正确:
我可以使用以下宏提高此代码的可读性:
#define CALL_IF_NOT_NULLPTR(ptr, method_call) if (ptr != nullptr) { ptr->method_call; }; CALL_IF_NOT_NULLPTR(ptr, SomeMethod()); CALL_IF_NOT_NULLPTR(ptr, SomeOtherMethod()); CALL_IF_NOT_NULLPTR(ptr, SomeMethodThatWasntMentionedBefore());
有没有办法在没有宏的情况下做同样的事情(
C++11
解决方案是 首选(?
有没有更好的方法?
不要与语言作斗争:
if (ptr) ptr->SomeMethod();
非常清晰、可读,并且比难以调试的宏替代或花哨的包装器类具有更少的字符。它还明确指出ptr
可能会被评估两次。
C++(尚(没有"仅在非空运算符时才调用"参见 C#
避免使用宏,你可以这样做:
//Lambda call
template<typename T, typename F, typename... Args>
void call_if_not_nullptr(T* ptr, F&& function, Args&&... args)
{
if(ptr != nullptr)
std::forward<F>(function)(std::forward<Args>(args)...);
}
//Member function call
template<typename T, typename R, typename... Args>
void call_if_not_nullptr(T* ptr, R(T::*mem_fun)(Args...), Args&&... args)
{
if(ptr != nullptr)
(ptr.*memfun)(std::forward<Args>(args)...);
}
用法:
class SomeType
{
public:
void noArgsFunction();
void argsFunction(int, int);
}
SomeType* pointer = new SomeType();
//Member function call
call_if_not_nullptr(pointer, &SomeType::noArgsFunction);
//Member function call with arguments
call_if_not_nullptr(pointer, &SomeType::argsFunction, 0, 3);
//Lambda call
call_if_not_nullptr(pointer, [pointer](){ pointer->noArgsFunction(); });
//Lambda call with arguments
call_if_not_nullptr(pointer, [pointer](int a, int b){ pointer->argsFunction(); }, 0, 5);
但是,我不建议这样做,检查nullptr足够清楚,并且会给您更清晰的错误。
好吧,您可以随时为您编写一个检查nullptr的包装类:
class
t_Wrapper
{
private: t_Target * m_ptr;
...
public: void
SomeMethod()
{
if(m_ptr)
{
m_ptr->SomeMethod();
}
}
public: void
SomeOtherMethod()
{
if(m_ptr)
{
m_ptr->SomeOtherMethod();
}
}
...
public: void
SomeMethodThatWasntMentionedBefore()
{
if(m_ptr)
{
m_ptr->SomeMethodThatWasntMentionedBefore();
}
}
};
t_Wrapper wrap(ptr);
wrap.SomeMethod();
wrap.SomeOtherMethod();
...
wrap.SomeMethodThatWasntMentionedBefore();
相关文章:
- 在c++中多次调用方法
- 如何确保在使用基于布尔值的两个方法之一调用方法时避免分支预测错误
- 接收字符串并使用它来调用方法C++
- 使用 gmock c++ 在真实对象上调用方法
- 不带预处理器的调用方法/文件的文件名/行号
- JNI从Android调用C++方法
- 在 C++ 的 Switch Case 中创建对象后对对象调用方法
- 如何使用接口指针调用方法,该指针是其具体类的一部分,而不是接口的一部分
- 从内部类中的方法从包含类调用方法
- 在销毁期间从另一个线程调用对象上调用方法是否未定义行为?
- 为什么派生类的实例从基类调用方法?
- 实例化对象并调用方法,使用单行语法在 C# 或 C++ 中返回值?
- C++当您取消引用指向类对象的指针,然后将其作为引用返回时,是否可以对此引用调用方法
- 通过模板函数对未知类型调用方法
- 从基于迭代器的for循环转换后,如何在map::find()中调用方法
- 创建一个C++DLL以从C#DLL调用方法
- 如何从qt中的类中调用方法
- 如何在不迭代的情况下对数组中的每个元素调用方法
- C++11 - 获取编译时的所有类变量,并在没有 Boost 的情况下为它们调用方法
- C ++:如何在不创建对象的情况下在主函数中调用方法