如何理解C++ enable_if中的推动因素

how to understand the enabler in C++ enable_if

本文关键字:if 何理解 C++ enable      更新时间:2023-10-16

以下enable_if用法是什么意思

template <
    typename R, typename F,
    typename std::enable_if<std::is_same<typename std::remove_cv<R>::type, any>::value>::type*& = enabler,
    typename... Args>
any call(F fn, Args&&... args) {
    return fn(std::forward<Args>(args)...);
}

尤其是"type*& = enabler"

它说:当且仅当非常量非易失性R模板参数的类型为 std::any 时启用call函数,以便该参数是指向enabler的参考指针。否则,编译器错误。

引用指针

是对指针的引用。例如,在C++中,我们可以执行以下操作:

void func(int** ptr)
{
   *ptr = new int[100]; //ptr is a pointer to pointer.
}

但我们也可以做到:

void func(int* &ptr)
{
    ptr = new int[100]; //ptr is a reference to a pointer.
}

现在对于上述代码的示例用法..

#include <iostream>
#include <any>

void* enabler = nullptr;
template <
    typename R, typename F,
    typename std::enable_if<std::is_same<typename std::remove_cv<R>::type, std::any>::value>::type*& = enabler,
    typename... Args>
std::any call(F fn, Args&&... args) {
    return fn(std::forward<Args>(args)...);
}

std::any func(int i)
{
    std::cout<<i<<"n";
    return std::any(1);
}
void func2(int i)
{
    std::cout<<i<<"n";
}
int func3(int i)
{
    std::cout<<i<<"n";
    return 200;
}
int main() 
{
    //Return type is an std::any..
    auto rn = call<std::any>(func, 10);
    std::cout<<std::any_cast<int>(rn)<<"n";
    //Return type is void and cannot be converted to std::any..
    //call<void>(func, 10); //Error here because void type is not `std::any` type..
    //Return type of `func3` is an integer.. `call` implicitly constructs an std::any from that..
    auto res = call<std::any>(func3, 20);
    std::cout<<std::any_cast<int>(res)<<"n";
    return 0;
}