首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何声明SFINAE类?

如何声明SFINAE类?
EN

Stack Overflow用户
提问于 2017-12-31 20:46:30
回答 3查看 1K关注 0票数 5

有些事情对我来说不是很好。这是声明一个只接受浮点模板参数的类的方式吗?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
template <typename T, swift::enable_if<std::is_floating_point<T>::value> = nullptr>
  class my_float;

我无法在这个类之外定义方法。不能编译,不确定原因

EN

回答 3

Stack Overflow用户

发布于 2017-12-31 20:54:16

好吧..。不完全是SFINAE。但是也许,使用模板专门化?如下所示?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
template <typename T, bool = std::is_floating_point<T>::value>
class my_float;

template <typename T>
class my_float<T, true>
 {
   // ...
 };

如果你真的想使用SFINAE,你可以写

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
template <typename T,
   typename = typename std::enable_if<std::is_floating_point<T>::value>::type>
class my_float
 {
   // ...
 };

或者(观察你的例子中没有的指针)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
template <typename T,
   typename std::enable_if<std::is_floating_point<T>::value>::type * = nullptr>
class my_float  // ------------------------------------------------^
 {
 };

编辑-- --

正如Yakk所建议的(谢谢!),您可以混合SFINAE和模板专门化来为不同的类型组开发不同版本的类。

例如,下面的my_class

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
template <typename T, typename = void>
class my_class;

template <typename T>
class my_class<T,
   typename std::enable_if<std::is_floating_point<T>::value>::type>
 {
   // ...
 };

template <typename T>
class my_class<T,
   typename std::enable_if<std::is_integral<T>::value>::type>
 {
   // ...
 };

开发了两个版本(两个不同的部分专门化),第一个版本用于浮点类型,第二个版本用于整数类型。并且可以容易地扩展。

票数 2
EN

Stack Overflow用户

发布于 2018-01-08 19:36:01

您还可以使用static_assert毒化无效类型。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
template <typename T>
class my_float {
  static_assert(std::is_floating_point<T>::value,
    "T is not a floating point type");
  // . . .
};

在我看来,这更直接一点。

使用其他任何一种方法,例如

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
template <typename T, bool = std::is_floating_point<T>::value>
class my_float;

template <typename T> class my_float<T, true> { /* . . . */ };

my_float<int,true>是有效类型。我并不是说这是一种糟糕的方法,但是如果您想要避免这种情况,就必须将my_float<typename,bool>封装在另一个模板中,以避免暴露bool模板参数。

票数 1
EN

Stack Overflow用户

发布于 2021-02-15 20:06:00

事实上,这样的东西对我来说是有效的(感谢SU3的回答)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
template<typename T, bool B = false>
struct enable_if {};

template<typename T>
struct enable_if<T, true> {
    static const bool value = true;
};

template<typename T, bool b = enable_if<T,is_allowed<T>::value>::value >
class Timer{ void start(); };

template<typename T, bool b>
void Timer<T,b>::start()
{ \* *** \*}

我之所以发布这个答案,是因为我不想使用部分专门化,而只是定义类的外部行为。

一个完整的可行示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
typedef std::integral_constant<bool, true> true_type;
typedef std::integral_constant<bool, false> false_type;

struct Time_unit {
};

struct time_unit_seconds : public Time_unit {
    using type = std::chrono::seconds;
};

struct time_unit_micro : public Time_unit {
    using type = std::chrono::microseconds;
};

template<typename T, bool B = false>
struct enable_if {
};

template<typename T>
struct enable_if<T, true> {
    const static bool value = true;
};

template<typename T,
        bool b = enable_if<T,
                std::is_base_of<Time_unit,
                        T>::value
        >::value>
struct Timer {
    int start();
};

template<typename T, bool b>
int Timer<T, b>::start() { return 1; }

int main() {
    Timer<time_unit_seconds> t;
    Timer<time_unit_micro> t2;
//    Timer<double> t3; does not work !

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

https://stackoverflow.com/questions/48045559

复制
相关文章
for和foreach循环语句
今天我们来讲解一下 for跟foreach 一、for 是一个循环语句 for break continue 从 i=0开始,到i=10结束,每次循环 for (i = 1; i <= 10; echo $i; } for (i = 10; i >0; echo $i; } //for可以嵌套 for (i = 1; i <= 10; for (j = 1; j <= 10; continue; echo i.j; } if($i==5) bre
老雷PHP全栈开发
2020/07/02
2.9K0
js forEach和 map 区别
forEach() 方法按升序为数组中含有效值的每一项执行一次 callbackFn 函数,那些已删除或者未初始化的项将被跳过(例如在稀疏数组上,见下方的示例)。
蓓蕾心晴
2022/12/06
4.6K0
迭代器和foreach原理。
迭代器是一种设计模式,它的定义为:提供一种方法访问一个容器对象中的各个元素,而又不需暴露该容器对象的内部细节。迭代器模式,就是为容器而生。
崔笑颜
2020/07/23
8410
javascript 数组遍历forEach和for用法
前言:前端开发过程中,常用到数组的遍历,我们通常采用的方式有forEach和for。下面介绍这两种方式的使用方法
侠客冷展堂
2022/01/19
1.1K0
javascript 数组遍历forEach和for用法
PHP中遍历XML之SimpleXML
  简单来讲述一些XML吧,XML是可扩展标记语言,是一种用于标记电子文件使其具有结构性的标记语言。XML是当今用于传输数据的两大工具之一,另外一个是json。
那一叶随风
2018/08/22
2.3K1
PHP中遍历XML之SimpleXML
.net Parallel.Foreach的Continue和Break和Return;
var parallelOption = new ParallelOptions() { MaxDegreeOfParallelism = 6 };
全栈程序员站长
2022/09/09
8840
c# 中for和foreach循环的区别
    (2)效率比for要高(C#是强类型检查,for循环对于数组访问的时候,要对索引的有效值进行检查)
vv彭
2020/10/27
4.9K0
c# 中for和foreach循环的区别
Java list foreach_java的foreach
从源码中可以看到:forEach()方法是Iterable<T>接口中的一个方法。Java容器中,所有的Collection子类(List、Set)会实现Iteratable接口以实现foreach功能。forEach()方法里面有个Consumer类型,它是Java8新增的一个消费型函数式接口,其中的accept(T t)方法代表了接受一个输入参数并且无返回的操作。
全栈程序员站长
2022/11/09
1.6K0
C# 多线程 Parallel.ForEach 和 ForEach 效率问题研究及理解
最近要做一个大数据dataTable循环操作,开始发现 运用foreach,进行大数据循环,并做了一些逻辑处理。在循环中耗费的时间过长。后来换成使用Parallel.ForEach来进行循环。 一开始认为, 数据比较大时,Parallel.ForEach肯定比 ForEach效率高,后来发现,其实并不是这样。
全栈程序员站长
2022/09/09
1.2K0
C# 多线程 Parallel.ForEach 和 ForEach 效率问题研究及理解
java退出foreach循环_forEach方法如何跳出循环[通俗易懂]
3.1 foreach()不能使用break和continue这两个关键字,foreach和普通的for循环是不同的,它不是普通的遍历,实现continue的效果可以直接使用return。
全栈程序员站长
2022/09/01
15K0
mysql foreach
把集合都封装进map中,比如这里的list1,list2,都加入到集合中,key 为list1,list2,然后按照如下方式取出,collection 属性中为放入map时的key
IT云清
2019/01/22
2.7K0
forEach、for...in 、 for...of
写法简单了许多,但是有缺点:不能中断循环(使用break语句或使用return语句)。
用户3258338
2020/06/02
1.3K0
forEach、for...in 、 for...of
foreach rf
library(randomForest) library(foreach) library(cvTools) set.seed(1234) K =10 R = 3 cv <- cvFolds(NROW(iris),K=K,R=R) grid <- expand.grid(ntree=c(10,100,200),mtry=c(3,4)) result <- foreach(g=1:NROW(grid),.combine = rbind) %do% { foreach(r=1:R,.combine = r
用户1359560
2018/08/27
1.1K0
PHP解析Xml:SimpleXML类学习笔记
SimpleXML 是 PHP 5 中的新特性。SimpleXML 扩展提供了一种获取 XML 元素的名称和文本的简单方式。与 DOM 或 Expat 解析器相比,SimpleXML 仅仅用几行代码就可以从 XML 元素中读取文本数据。SimpleXML 可把 XML 文档(或 XML 字符串)转换为对像;
房东的狗丶
2023/02/17
9730
Parallel.For循环 和 Parallel.ForEach循环
但是,有的时候又不是这样。如果迭代之间彼此独立,并且程序运行在多核处理器的机器上,如果能将不同的迭代放在不同的处理器上并行处理的话,将会受益匪浅。Parallel.For 和 Parallel.ForEach结构就是这样做的。
全栈程序员站长
2022/09/09
2.7K0
Parallel.For循环 和 Parallel.ForEach循环
Java 中for循环和foreach循环哪个更快?
在Java编程中,循环结构是程序员常用的控制流程,而for循环和foreach循环是其中比较常见的两种形式。关于它们哪一个更快的讨论一直存在。本文旨在探究Java中的for循环和foreach循环的性能差异,并帮助读者更好地选择适合自身需求的循环方式。通过详细比较它们的遍历效率、数据结构适用性和编译器优化等因素,我们将为大家揭示它们的差异和适用场景,以便您能够做出更明智的编程决策。
葡萄城控件
2023/10/16
6300
Java 中for循环和foreach循环哪个更快?
JavaScript编程趋势:用map和filter替换forEach
当你需要拷贝一个数组的全部或者部分到一个新数组的时候,优先使用map和filter而不是forEach。
一墨编程学习
2018/10/22
1.7K0
点击加载更多

相似问题

从.emacs设置Emacs 24颜色主题

28

更改颜色主题Emacs 24 -顺序事项

511

Emacs中颜色主题之间的切换(< v.24)

22

Emacs 24客户端未正确加载颜色主题

10

使用emacs 24循环定制主题

22
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文