理解用于检查成员函数是否存在的C ++ 11解决方案

时间:2017-04-18 13:52:09

标签: c++11

  

https://stackoverflow.com/a/31860104

#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
{
};    

问题&GT;鉴于提出的解决方案optionalToString,我如何使用它来检测TA在TB没有的情况下是否具有字符串。

2 个答案:

答案 0 :(得分:3)

使用this code中的can_apply的解决方案:

template<class T>
using toString_result = decltype(std::declval<T>().toString());

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

像这样使用:

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

答案 1 :(得分:1)

给定的解决方案允许您始终从任何对象获取字符串。如果它具有toString()成员函数,则将使用此函数,否则将使用默认字符串。用法示例,给出以上内容:

TA a;
TB b;
std::cout << "a: " << optionalToString(&a) << '\n';
std::cout << "b: " << optionalToString(&b) << std::endl;

但是,如果ab具有toString()方法,您将无法获得布尔值。如果你想要,你需要像奥尼尔提出的解决方案。