基于下一个参数的 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);
};
我需要做这样的事情:
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);
};