相关疑难解决方法(0)

是否可以编写模板来检查函数的存在?

是否可以编写一个模板来改变行为,具体取决于是否在类上定义了某个成员函数?

这是我想写的一个简单例子:

template<class T>
std::string optionalToString(T* obj)
{
    if (FUNCTION_EXISTS(T->toString))
        return obj->toString();
    else
        return "toString not defined";
}
Run Code Online (Sandbox Code Playgroud)

所以,如果class T已经toString()确定的话,就使用它; 否则,它没有.我不知道怎么做的神奇部分是"FUNCTION_EXISTS"部分.

c++ templates sfinae template-meta-programming

458
推荐指数
20
解决办法
14万
查看次数

检查类是否具有给定签名的成员函数

我要求一个模板技巧来检测一个类是否具有给定签名的特定成员函数.

问题类似于这里引用的问题 http://www.gotw.ca/gotw/071.htm 但不一样:在Sutter的书中,他回答了C类必须提供成员函数的问题.一个特定的签名,否则程序将无法编译.在我的问题中,我需要做一些事情,如果一个类有这个功能,否则做"其他".

boost :: serialization面临类似的问题,但我不喜欢他们采用的解决方案:模板函数默认调用具有特定签名的自由函数(您必须定义),除非您定义特定的成员函数(在他们的情况下"序列化",它采用给定类型的2个参数)与特定签名,否则将发生编译错误.那就是实现侵入式和非侵入式序列化.

我不喜欢这个解决方案有两个原因:

  1. 要非侵入式,您必须覆盖boost :: serialization命名空间中的全局"序列化"函数,因此您可以在您的客户端代码中打开命名空间提升和命名空间序列化!
  2. 解决这个混乱的堆栈是10到12个函数调用.

我需要为没有该成员函数的类定义自定义行为,并且我的实体位于不同的名称空间内(我不想覆盖在一个名称空间中定义的全局函数,而我在另一个名称空间中)

你能给我一个解决这个难题的提示吗?

c++ templates sfinae c++11

124
推荐指数
11
解决办法
7万
查看次数

检查类是否具有签名功能

此站点上有其他答案使用SFINAE但非C++ 11代码,还有其他人使用C++ 11代码(如decltypes)来简化此过程.但是,我不确定如何检查类是否具有特定签名的函数.

我想检查一个类是否具有函数receive(const Event &)where Event在调用check函数时指定的类类型.

c++ sfinae c++11

2
推荐指数
1
解决办法
2441
查看次数