How do we test if an expression of a certain type can be invoked with a prvalue?

后端 未结 2 1341
日久生厌
日久生厌 2021-02-05 13:05

With c++17 we have fancy new is_invocable and fancy new prvalues that aren\'t really values.

This permits you to create an object without having to first logically const

2条回答
  •  梦如初夏
    2021-02-05 13:46

    Is there an alternative, or do we have to invent our own trait to handle this case?

    Yeah, you'd just have to write your own trait that doesn't use declval. Assuming you have std::is_detected lying around (which I know you certainly do):

    template  T make();
    
    template 
    using invoke_result_t = decltype(std::declval()(make()...));
    //                               ^^^^^^^^^^^^^     ^^^^^
    
    template 
    using is_invocable = std::is_detected;
    

    This way, std::is_invocable is false_type, but is_invocable is true_type.

    I intentionally use declval() for the function instead of make so as to allow using decltype(f) here. Really, invoke_result_t should be more complicated, and "do the right thing" for pointers to members, etc. But this is at least a simple approximation that indicates the viability of this approach.

提交回复
热议问题