jjzjj

typetraits

全部标签

c++ - 返回枚举的基础类型和整数的整数的元编程构造

我需要编写一个元编程结构,当给定一个枚举类型时,它返回该枚举的基础类型,但当给定一个整数时,它返回该整数。例如:enumEnum:short{VALUE1,VALUE2};int_type::type//->longint_type::type//->short我试过了templatestructint_type{usingtype=typenamestd::enable_if::value,typenamestd::underlying_type::type>::type;};templatestructint_type{usingtype=typenamestd::enable_i

c++ - 关于获取函数结果类型的各种方法

在必须推导函数调用结果类型的上下文中,C++似乎更乐于帮助我们,提供(至少据我所知是以下)两种解决方案:resultof类型特征:std::result_of::type核心语言语法:decltype(std::declval()(std::declval()...);我的问题是,两者之间有什么区别吗?是否存在一个不能被另一个替代的上下文,如果不是,为什么我们需要一个类型特征来做一些语言可以开箱即用的事情? 最佳答案 存在三个差异。最初,std::result_of不需要对SFINAE友好。因此,如果要在上下文中使用它来验证F可以用

c++ - 使用 std::enable_if 保护复制构造函数

我编写了一个类来促进具有以下构造函数的类型删除:classEnvelope{public:Envelope(){}templateEnvelope(Runnablerunnable):m_runFunc(&Envelope::RunAndDeleteRunnable),m_runnable(newRunnable(runnable)){}templateEnvelope(Runnable*runnable):m_runFunc(&Envelope::RunRunnable),m_runnable(runnable){}};我想重写第一个非默认构造函数以获取引用而不是值(Runnable

C++:SFINAE 区分填充和范围构造函数?

Here是一个询问如何区分填充和范围构造函数的问题。代码复制在这里:templatestructNaiveVector{vectorv;NaiveVector(size_tnum,constT&val):v(num,val){//fillcoutNaiveVector(InputIteratorfirst,InputIteratorlast):v(first,last){//rangecout如该问题中所述,上面的代码不起作用。解决方案是使用SFINAE定义范围构造函数,像这样example:template()))>::type>::value,void>::type>NaiveVe

c++ - 用于查找相似的连续类型名称的模板元程序

我是模板元编程的新手,正在尝试创建一个程序来查找参数包是否具有连续的相同类型名称。例如,将返回true和和不会。我设法编写了这段代码,但它似乎在将参数包的每个值与其自身进行比较。我只是在寻找一种方法来遍历参数包的值以与其连续元素进行比较。templatestructsameTypename{enum{value=false};};templatestructsameTypename{enum{value=true};};templatestructconsTypename{enum{value=(sameTypename,consTypename>::value)};};templat

c++ - 可变参数模板 - 递归函数 - 最后一个可变参数成员

我有以下代码以及从以下位置复制的可变参数模板:https://www.youtube.com/watch?v=iWvcoIKSaoc@41:30autosum(){return0;}templateautosum(Headhead,Tail...tail){returnhead+sum(tail...);}intmain(){cout我有两个问题:1.此处需要sum()函数,以便在处理最后一个可变参数成员时传入void的返回值-是否可以避免编写此sum()函数并具有相同的功能?从sum()函数返回整数“0”会限制整数使用整个模板-我可以扩展相同的模板来连接字符串吗?谢谢

c++ - 为什么在取消引用的函数指针上使用时 std::is_function 的计算结果为 false?

我正在尝试使用std::is_function来确定变量是否为函数指针。运行以下代码时#include#includeusingnamespacestd;intmain(){typedefint(*functionpointer)();functionpointerpmain=main;cout::value::value::value::value输出是PFivE0PFivE0FivE1FivE0任何有见识的人都可以解释为什么std::is_function的最后一个表达式的计算结果为false吗?(代码在g++4.7、g++4.8和clang++3.2下测试)

c++ - 在编译时检查模板参数类型是否为集合或多重集,以及容器的元素类型是否为算术

我有一个名为“equal”的函数接受2个参数,每个参数应该是std::set或std::multiset,容器的元素类型应该是算术类型(int、float、double...).如果以上2个条件不满足,我希望编译器报告错误。我希望我的代码可以这样运行:intmain(void){std::sets1;std::sets2;equal(s1,s2);//OKstd::multisets3;std::multisets4;equal(s3,s4);//OKstd::sets5;std::multisets6;equal(s5,s6);//compileerrorstd::sets7;std

c++ - 正确使用 std::enable_if 或如何替换它

这是对std::enable_if的正确使用吗?它有效,但它是否正确?//*.hfiletemplatestatictypenamestd::enable_if::value,T>::typerandomFrom(constTmin,constTmax);templatestatictypenamestd::enable_if::value,T>::typerandomFrom(constTmin,constTmax);.//*.inlfiletemplateinlinetypenamestd::enable_if::value,T>::typeMath::randomFrom(con

c++ - 用于测试对象是否与 boost 范围兼容的元函数

有没有,或者你会怎么写,一个元函数类来测试一个类是否与boost::range兼容?我想使用boost::enable习惯用法,比如templateConstructor::Constructor(constT&t,__attribute__((unused))typenameboost::enable_if>::type*aux=NULL)用于适当的is_range_compatible元函数。我知道is_container来自pretty_print,它捕获了很多情况,但不是所有适用于boost::range的情况。编辑这是使用C++03,所以我无权访问C++11功能。我使用的是旧