首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >了解用于检查成员函数存在性的C++11解决方案

了解用于检查成员函数存在性的C++11解决方案
EN

Stack Overflow用户
提问于 2017-04-18 13:52:08
回答 2查看 51关注 0票数 0

https://stackoverflow.com/a/31860104

代码语言:javascript
运行
复制
#include <iostream>
#include <string>

template<class T>
auto optionalToString(T* obj)
 -> decltype(  obj->toString()  )
{
    return     obj->toString();
}
auto optionalToString(...) -> std::string
{
    return "toString not defined";
}

struct TA
{
    std::string toString() const
    {
        return "Hello";   
    }
};

struct TB
{
};    

Question>给出了提议的解决方案optionalToString,我如何使用它来检测TA有toString,而TB没有。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-18 14:44:51

一种基于can_applythis code解决方案

代码语言:javascript
运行
复制
template<class T>
using toString_result = decltype(std::declval<T>().toString());

template<class T>
constexpr auto has_toString = can_apply<toString_result, T>::value;

像这样使用:

代码语言:javascript
运行
复制
struct TA
{
    std::string toString() const
    {
        return "Hello";   
    }
};

struct TB
{
};

int main()
{
    std::cout << has_toString<TA> << '\n';
    std::cout << has_toString<TB> << '\n';
    return 0;
}

DEMO

票数 3
EN

Stack Overflow用户

发布于 2017-04-18 16:19:50

给定的解决方案允许您始终从任何对象获取字符串。如果它有一个toString()成员函数,这将被使用,否则,一个默认字符串。鉴于上述情况,使用示例:

代码语言:javascript
运行
复制
TA a;
TB b;
std::cout << "a: " << optionalToString(&a) << '\n';
std::cout << "b: " << optionalToString(&b) << std::endl;

但是,无论a还是b是否有toString()方法,您都不会得到布尔值。如果你想要的话,你需要像O‘’Neil提出的解决方案。

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

https://stackoverflow.com/questions/43474174

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档