有点卡住。
尝试从我的模板类内部检查参数是否为引用类型
似乎在功能中起作用。
但是在我的函数包装器中,它总是返回true。
#include <vector>
#include <any>
template <class T>
T CallFunction(const std::vector<std::any>& args) {
for (size_t i = args.size(); i > 0; i--) {
std::cout << std::boolalpha << std::is_reference<decltype(args[i-1].type())>::value << std::endl; // always true
}
return T();
}
template<typename Fn> class FunctionBase;
template<typename R, typename... Args>
class FunctionBase <R(__cdecl*)(Args...)> {
public:
FunctionBase() {}
R operator()(Args... args) {
return CallFunction<R>({ args ... });
}
};
int foo(int a, int& b) {
std::cout << std::boolalpha << std::is_reference<decltype(a)>::value << std::endl; // falae
std::cout << std::boolalpha << std::is_reference<decltype(b)>::value << std::endl; // true
return a + b;
}
int main() {
int in = 10;
foo(1, in);
FunctionBase<decltype(&foo)> func;
func(1, in);
}
我认为您想要实现的目标更像是这样:https://gcc.godbolt.org/z/-rQ6jG
您想声明为universal reference的R operator()(Args... args)
中缺少perfect forwarding中的CallFunction
,然后是template <class T, class Arg> CallFunction(Arg&&)
,然后使用Arg = int
实例化了Arg = int&
和CallFunction<R>(std::forward<Args>(args))...
]在您的FunctionBase
类中。
#include <vector>
#include <any>
#include <iostream>
template <class T, class Arg>
T CallFunction(Arg&&) {
std::cout << std::boolalpha << std::is_reference<Arg>::value << std::endl; // not always true
return T();
}
template<typename Fn> class FunctionBase;
template<typename R, typename... Args>
class FunctionBase <R(*)(Args...)> {
public:
FunctionBase() {}
R operator()(Args&&... args) { // Args&& is a universal reference
// Here we use perfect forwarding so that Args type does not change
std::initializer_list<R>{CallFunction<R>(std::forward<Args>(args)) ...};
return R();
}
};
程序现在将打印:
Program returned: 0
false
true
false
true