C ++检查函数是否存在,如果存在,则调用

时间:2017-06-08 13:41:43

标签: c++ c++14 c++17

在我目前的C ++(14/17)项目中,我需要一种方法,首先找到一个函数,然后调用该函数(如果存在的话)。

在目前阶段,我已经找到了一种方法来判断该功能是否存在。 但现在我不确定如何实际调用或调用它。

代码

如果功能区(std::string toString())确实存在,这是我当前的检测代码:

/**
 * Found at:
 * https://stackoverflow.com/a/16824239
 */
#include <type_traits>

template<typename, typename T>
struct has_function {
    static_assert(std::integral_constant<T, false>::value, "Second template parameter needs to be a function type.");
};

template<typename C, typename Ret, typename... Args>
struct has_function<C, Ret(Args...)> {
private:
    template<typename T>
    static constexpr auto check(T *) -> typename
    std::is_same<decltype(std::declval<T>().toString(std::declval<Args>()...)), Ret>::type;

    template<typename>
    static constexpr std::false_type check(...);

    typedef decltype(check<C>(0)) type;

public:
    static constexpr bool value = type::value;
};

我的对象和测试std::string toString()函数的主要功能:

#include <string>
#include <iostream>

struct Object {
    virtual auto toString() -> std::string { return "Object"; }
};

struct TestObject: Object {
    std::string toString() override {
        return "TestObject";
    }
};

struct NonObject { }

int main() {
    if (has_function<Object, std::string(void)>::value)
        std::cout << "Object has toString()" << std::endl;

    if (has_function<TestObject, std::string(void)>::value)
        std::cout << "TestObject has toString()" << std::endl;

    if (has_function<NonObject, std::string(void)>::value)
        std::cout << "NonObject has toString()" << std::endl;
}

给出了输出:

Object has toString()!
TestObject has toString()!

现在我要求一种实际调用/调用std::string toString()的方法 我确实尝试过类似的东西(在has_function结构中):

static constexpr auto call(...) -> Ret {
    return decltype(std::declval<C>().toString(std::declval<Args>() ...))();
}

Object上的TestObjectNonObject完全没有任何关系(明显?),在/etc/gitlab/gitlab.rb上使用时甚至无法编译。
(我可能会误解decltype,declval等。)

提前致谢。

更新

这个问题重复。
我试图在找到它之后执行/调用/调用该函数。 正如我已经说过的那样:我已经声明了这个函数了吗?&#39;部分工作(我从https://stackoverflow.com/a/16824239获得,如上所示)。

在上半部分,我解释了我的尝试,显然没有成功。

0 个答案:

没有答案