我已经使用了SFINAE成语很多次了,我习惯于将std::enable_if<>放在模板参数中,而不是返回types中。 然而,我遇到了一个不起作用的小事,我不知道为什么。 首先,这是我的主要: int main() { foo(5); foo(3.4); } 这里是触发错误的foo的实现: template<typename T, typename = typename std::enable_if<std::is_integral<T>::value>::type> auto foo(T) -> void { std::cout << "I'm an integer!\n"; } template<typename T, typename = typename std::enable_if<std::is_floating_point<T>::value>::type> auto foo(T) -> void { std::cout << "I'm a floating point number!\n"; } 这是一个可以正常工作的代码: template<typename T> auto foo(T) -> typename std::enable_if<std::is_integral<T>::value>::type { […]
为了创buildalgorithm模板函数,我需要知道类或模板参数中的x或X(以及y或Y)。 当使用我的函数为MFC CPoint类或GDI + PointF类或其他一些时可能会有用。 他们都使用不同的x。 我的解决scheme可以简化为以下代码: template<int> struct TT {typedef int type;}; template<class P> bool Check_x(P p, typename TT<sizeof(&P::x)>::type b = 0) { return true; } template<class P> bool Check_x(P p, typename TT<sizeof(&P::X)>::type b = 0) { return false; } struct P1 {int x; }; struct P2 {float X; }; // it also could […]
我正在研究核心常量expression式*中允许的内容, C ++标准草案第5.19节的常量expression式中包含了以下内容: 一个条件expression式是一个核心常量expression式,除非它涉及以下之一作为一个潜在的评估子expression式(3.2),但是没有被评估的逻辑AND(5.14),逻辑OR(5.15)和条件(5.16)操作的子expression式不考虑[注意:重载操作符调用一个函数。 并列出了下面的子弹中的排除项(包括我的重点 ): – 注意:例如,包括有符号整数溢出(第5章),某些指针算术(5.7),除以零(5.6)或某些移位操作(5.8) – 结束注释]。 呃 ? 为什么常量expression式需要这个子句来覆盖未定义的行为 ? 常量expression式有什么特别之处,需要不确定的行为才能排除在特殊情况之外呢? 这个条款有没有给我们带来任何好处或工具? 作为参考,这看起来像广义常量expression式的最后一个版本。
我观察了Walter Brown在Cppcon14关于现代模板编程( 第一部分 , 第二部分 )的演讲,他在那里介绍了他的void_t SFINAE技术。 例: 给定一个简单的variables模板,如果所有模板参数都格式正确,则该模板的计算结果为void template< class … > using void_t = void; 以及检查名为member的成员variables是否存在的特征: template< class , class = void > struct has_member : std::false_type { }; // specialized as has_member< T , void > or discarded (sfinae) template< class T > struct has_member< T , void_t< decltype( T::member ) > […]
我要求一个模板技巧来检测一个类是否具有给定签名的特定成员函数。 这个问题类似于http://www.gotw.ca/gotw/071.htm中的一个,但不一样:在Sutter的书中,他回答了C类必须提供成员函数的问题一个特殊的签名,否则程序将不能编译。 在我的问题,我需要做一些事情,如果一个类有这个function,否则做“别的东西”。 boost :: serialization也面临类似的问题,但我不喜欢他们采用的解决scheme:一个模板函数默认调用一个自由函数(你必须定义)一个特定的签名,除非你定义一个特定的成员函数在他们的情况下,使用特定types的2个参数进行“序列化”),否则会发生编译错误。 那就是实现侵入式和非侵入式序列化。 我不喜欢这个解决scheme有两个原因: 要非侵入性,你必须覆盖boost :: serialization命名空间中的全局“serialize”函数,所以你有你的客户端代码来打开命名空间提升和命名空间序列化! 解决这个混乱的堆栈是10到12个函数调用。 我需要为没有该成员函数的类定义一个自定义行为,并且我的实体位于不同的名称空间中(并且我不想在另一个名称空间中重写在一个名称空间中定义的全局函数) 你能给我一个解决这个难题的提示吗?
我想能够反省一个C ++类的名称,内容(即成员和他们的types)等我在这里说本地C ++,而不是托pipeC ++,它有反思。 我意识到C ++使用RTTI提供一些有限的信息。 哪些额外的库(或其他技术)可以提供这些信息?
是否有可能编写一个模板来改变行为取决于某个成员函数是否定义在一个类上? 以下是我想写的一个简单例子: template<class T> std::string optionalToString(T* obj) { if (FUNCTION_EXISTS(T->toString)) return obj->toString(); else return "toString not defined"; } 所以,如果class T有toString()定义,那么它使用它; 否则,它不。 我不知道怎么做的神奇的部分是“FUNCTION_EXISTS”部分。