模板函子包装器,可以返回void或非void值

liz*_*isk 2 c++ templates metaprogramming c++11

如何从模板函子包装器返回任意类型(void或non-void)?我使用包装器用于前置条件和后置条件,因此我需要在从包装器返回之前将返回值存储在局部变量中.但是当返回的类型为void时,编译器会给出错误,因为变量不能具有void类型.这可以做什么?

template <typename Functor, typename... Args>
auto Decorate(Functor f, Args&&... args)
-> decltype(f(std::forward<Args>(args)...)) {
    // preconditions
    const auto result = f(std::forward<Args>(args)...);
    // postconditions
    return result;
}
Run Code Online (Sandbox Code Playgroud)

Die*_*ühl 5

在合适的类的构造函数/析构函数中运行前置条件和后置条件,并直接返回值!只要您不需要触摸后置条件中的返回值,这应该不是问题!

struct condition
{
    condition() { /* do pre-condition checks */ }
    ~condition() { /* do post-condition checks */ }
    condition(condition&) = delete;
    void operator= (condition&) = delete;
};
template <typename Functor, typename... Args>
auto Decorate(Functor f, Args&&... args)
    -> decltype(f(std::forward<Args>(args)...)) {
    condition checker;
    return f(std::forward<Args>(args)...);
}
Run Code Online (Sandbox Code Playgroud)