我想问,是否可以为返回双的算术类型和容器(数组、向量、值数组等)编写重载函数.它返回valarray。简单例子
template<typename T>
double foo(T x) {
return x;
}
template<typename T>
std::valarray<double> foo(T const &arr) {
std::valarray<double> valarr(1,1);
return valarr;
}结果,我得到了预期的消息:调用'foo‘是模棱两可的。是否有可能编写这样的函数?
我非常感谢所有的评论。
发布于 2021-11-09 13:37:50
您可以使用std::enable_if执行您想做的事情,如下所示:
#include <iostream>
#include <string>
#include <valarray>
//overload for arthemtic types
template<typename T>
std::enable_if_t<std::is_arithmetic_v<T>, double> foo(T x)
{
std::cout<<"arithmetic version"<<std::endl;
return x;
}
//overload for array
template<typename T, std::size_t N>
std::valarray<double> foo(T const (&arr)[N])
{
std::valarray<double> valarr(2,5);
std::cout<<"array version"<<std::endl;
return valarr;
}
//overload for non-arthemtic types
template<typename T>
std::enable_if_t<!std::is_arithmetic_v<T>, T> foo(T x) //note the "!" in this version
{
std::cout<<"non-arithmetic version"<<std::endl;
return x;
}
int main() {
int arr[3] = {1,2,3};
foo(arr);//uses array version
foo(5); //uses arithmetic version
int p= 0, *c = &p;
foo("string");//uses array version
foo(p);//uses arithmetic version
foo(c); //uses non-arithmetic version
} 以上程序的输出可以看到这里。
发布于 2021-11-09 13:18:26
您可以使用C++20概念
#include <valarray>
#include <concepts>
template<typename T>
requires std::is_arithmetic_v<T>
double foo(T x) {
return x;
}
template<std::ranges::random_access_range T>
requires std::is_arithmetic_v<std::ranges::range_value_t<T>>
std::valarray<double>
foo(T const& arr) {
std::valarray<double> valarr(1,1);
return valarr;
}发布于 2021-11-09 13:12:23
对于C-数组类型,它将是:
template<typename T, std::size_t N>
std::valarray<double> foo(T const (&arr)[N])
{
// ...
}https://stackoverflow.com/questions/69898742
复制相似问题