如何解决是否有适用于任何可能情况的模板通用调用运算符?
我想创建一个智能指针,以防它有一个函数(静态、lambda 或成员函数),可以使用“operator()”调用它,这是我的第一种方法:
#include <cstdio>
#include <type_traits>
#include <iostream>
#include <string>
using namespace std;
template <typename Class>
struct TestPtrImpl {
Class* ptr;
TestPtrImpl(Class* ptr) : ptr(ptr) { }
template <typename... Args>
inline auto operator()(Args... args) {
if (ptr) {
if constexpr (std::is_invocable<Class,Args...>::value) {
return ptr(args...);
}
}
}
};
template <typename TClass>
TestPtrImpl<TClass> TestPtr(TClass* ptr) { return TestPtrImpl<TClass>(ptr); }
int test(string b,int a = 3) {
cout << "Hello World" << b << a << endl;
return 0;
}
int main() {
cout << TestPtr(test)("h",5) << endl;
return 0;
}
但是当我尝试仅使用字符串参数调用 TestPtr(test) 时,它不会调用该函数(因此默认参数似乎不适用于“std::is_invocable”,是否还有其他解决方案可以使用在任何函数情况下?
而且,是否有可以安全调用的“->”实现(例如 C# 中的空条件“?”运算符)?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。