Questions tagged «sfinae»

替换失败不是错误。这是一种C ++编程技术,它允许模板验证其模板参数的属性,从而在某些类型的对象可用时允许使用不同的专业化方法。

26
模板检查是否存在类成员函数?
是否可以编写一个模板来更改行为,具体取决于是否在类上定义了某个成员函数? 这是我要写的一个简单示例: 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”部分。

28
如何向C ++应用程序添加反射?
我希望能够对C ++类的名称,内容(即成员及其类型)等进行自省。我在这里说的是本机C ++,而不是具有反射的托管C ++。我意识到C ++使用RTTI提供了一些有限的信息。哪些其他库(或其他技术)可以提供此信息?

3
为什么我应该避免在函数签名中使用std :: enable_if
Scott Meyers发布了他的下一本书EC ++ 11的内容和状态。他写道,书中的一项可能是“避免std::enable_if使用函数签名”。 std::enable_if 可用作函数参数,返回类型或类模板或函数模板参数,以有条件地从重载解析中删除函数或类。 在此问题中,显示了所有三种解决方案。 作为功​​能参数: template<typename T> struct Check1 { template<typename U = T> U read(typename std::enable_if< std::is_same<U, int>::value >::type* = 0) { return 42; } template<typename U = T> U read(typename std::enable_if< std::is_same<U, double>::value >::type* = 0) { return 3.14; } }; 作为模板参数: template<typename T> struct …

2
void_t如何工作
我观看了Walter Brown在Cppcon14上有关现代模板编程的演讲(第一部分,第二部分),他介绍了他的void_tSFINAE技术。 示例: 给定一个简单的变量模板,该模板评估void所有模板参数是否格式正确: template< class ... > using void_t = void; 以及以下特征来检查是否存在称为member的成员变量: 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 ) > …
148 c++  templates  c++14  sfinae 

16
检查类是否具有给定签名的成员函数
我要一个模板技巧来检测一个类是否具有给定签名的特定成员函数。 这个问题类似于一个引用在这里 http://www.gotw.ca/gotw/071.htm ,但不一样的:在萨特的书的项目,他回答的问题是C类必须提供带成员函数特定签名,否则程序将无法编译。在我的问题中,如果一个类具有该功能,则需要执行某些操作,否则执行“其他操作”。 boost :: serialization面临着类似的问题,但我不喜欢它们采用的解决方案:模板函数默认情况下调用具有特定签名的自由函数(必须定义),除非您定义特定的成员函数(在他们的情况下,“序列化”使用两个具有给定类型的参数(带有特定签名),否则会发生编译错误。那就是要实现介入式和非介入式序列化。 我不喜欢该解决方案,原因有两个: 要成为非侵入式,您必须覆盖boost :: serialization名称空间中的全局“序列化”功能,以便您可以在客户端代码中打开名称空间boost和名称空间序列化! 解决该混乱的堆栈是10到12个函数调用。 我需要为没有该成员函数的类定义一个自定义行为,并且我的实体位于不同的名称空间中(并且我不想覆盖在一个名称空间中定义的全局函数,而在另一个名称空间中) 你能给我一个解决这个难题的提示吗?
135 c++  c++11  templates  sfinae 


2
std :: is_function如何实现?
以下是如何实现的std::is_function? template<class T> struct is_function : std::integral_constant< bool, !std::is_const<const T>::value && !std::is_reference<T>::value > {}; (来自CPP参考) 在我看来,int在此定义下,an 将是一个函数。我想念什么?
82 c++  templates  std  sfinae 

10
如何检测类中是否存在特定的成员变量?
为了创建算法模板函数,我需要知道在作为模板参数的类中是x还是X(以及y或Y)。当将我的函数用于MFC CPoint类或GDI + PointF类或其他一些函数时,此方法可能很有用。他们都在其中使用不同的x。我的解决方案可以简化为以下代码: 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 …

2
在C ++中实现SFINAE的方法
我在项目中大量使用函数SFINAE,并且不确定以下两种方法(除了样式)是否存在任何差异: #include <cstdlib> #include <type_traits> #include <iostream> template <class T, class = std::enable_if_t<std::is_same_v<T, int>>> void foo() { std::cout << "method 1" << std::endl; } template <class T, std::enable_if_t<std::is_same_v<T, double>>* = 0> void foo() { std::cout << "method 2" << std::endl; } int main() { foo<int>(); foo<double>(); std::cout << "Done..."; std::getchar(); …
40 c++  sfinae 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.