基于下一个参数的 C++ 模板默认参数

C++ template default argument based on next argument

我需要做这样的事情:

template<class A=B, class B>
    A fn(B x) { return A(x); };

int main()
{
    int i = fn(5); // Error, no matching overload found
    double d = fn<double>(5);
};

因此,函数模板会自动从函数参数中推导出类型,但调用者可以根据需要更改第一个类型。有什么办法吗?

在以下情况下您可以简单地使用 constexpr if

struct NO_TYPE;

template<class RET_TYPE = NO_TYPE, class IN_TYPE>
    auto fn(IN_TYPE x)
{
    if constexpr ( std::is_same_v< RET_TYPE, NO_TYPE> )
    {    
        std::cout << "1" << std::endl;
        return IN_TYPE(x);
    }    
    else 
    {    
        std::cout << "2" << std::endl;
        return RET_TYPE(x);
    }    
}

int main()
{
    int i = fn(5); // Error, no matching overload found
    double d = fn<double>(5);
};