首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++,超限函数,模板

C++,超限函数,模板
EN

Stack Overflow用户
提问于 2021-11-09 13:10:18
回答 3查看 75关注 0票数 0

我想问,是否可以为返回双的算术类型和容器(数组、向量、值数组等)编写重载函数.它返回valarray。简单例子

代码语言:javascript
复制
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‘是模棱两可的。是否有可能编写这样的函数?

我非常感谢所有的评论。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-11-09 13:37:50

您可以使用std::enable_if执行您想做的事情,如下所示:

代码语言:javascript
复制
#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
} 

以上程序的输出可以看到这里

票数 1
EN

Stack Overflow用户

发布于 2021-11-09 13:18:26

您可以使用C++20概念

代码语言:javascript
复制
#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; 
}

演示。

票数 2
EN

Stack Overflow用户

发布于 2021-11-09 13:12:23

对于C-数组类型,它将是:

代码语言:javascript
复制
template<typename T, std::size_t N>
std::valarray<double> foo(T const (&arr)[N])
{
    // ...
}

演示

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69898742

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档