在我目前的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
上的TestObject
与NonObject
完全没有任何关系(明显?),在/etc/gitlab/gitlab.rb
上使用时甚至无法编译。
(我可能会误解decltype,declval等。)
提前致谢。
这个问题不重复。
我试图在找到它之后执行/调用/调用该函数。
正如我已经说过的那样:我已经声明了这个函数了吗?&#39;部分工作(我从https://stackoverflow.com/a/16824239获得,如上所示)。
在上半部分,我解释了我的尝试,显然没有成功。