空函数(...)和空类型的 std::is_same ?

Nuu*_*rek 2 c++ type-traits std-function

我得到了这段代码:

template <class FunctionType> class Entry {
    std::function<FunctionType> internalFunction;

    template<class... Arguments>
    auto operator()(Arguments... arguments) -> decltype(internalFunction(arguments...)){

        if (std::is_same<decltype(internalFunction(arguments...)), void>::value) {
            internalFunction(arguments...);
        } else {
            auto result = internalFunction(arguments...);

            return result;      
        }
    }
};
Run Code Online (Sandbox Code Playgroud)

入口类旨在包装std::function. 它适用于所有返回类型,只有一个例外 - void。我无法让它工作。我也试过std::is_void,它不会为 type 的函数返回 true void(...)。对于std::is_same.

如何解决这个问题?

Jon*_*ely 5

return internalFunction(arguments...);
Run Code Online (Sandbox Code Playgroud)

即使internalFunction返回也有效void

尝试将结果存储在中间对象中是行不通的,因为您无法创建 type 的对象void,因为它不是对象类型。

if不起作用,因为if是运行时条件,编译器仍然需要编译条件的两个分支,因此它们都必须是有效的 C++。

如果您需要创建一个中间结果类型的变量,那么您不能在这种void情况下使用该代码。您可以为返回的函数编写部分特化void

template <class FunctionType> class Entry {
    std::function<FunctionType> internalFunction;

    template<class... Arguments>
    auto operator()(Arguments... arguments) -> decltype(internalFunction(arguments...))
    {

        auto result = internalFunction(arguments...);

        return result;      
    }
};

template <class... ArgTypes> class Entry<void(ArgTypes...)> {
    std::function<void(ArgTypes...)> internalFunction;

    template<class... Arguments>
    void operator()(Arguments... arguments) {
        internalFunction(arguments...);
    }
}; 
Run Code Online (Sandbox Code Playgroud)

这不适用于返回void的函数,但不适用于 return 的函子void,这样做有点困难。