在调用函数上实现C++转换



我想使用 C++11/14 对参数进行额外转换来实现一个专门的调用。基本上,这个想法是:

struct Foo {
private:
void* ptr;
public:
void* get();
};

template <typename F, typename... Args>
auto convert_invoke(F&& f, Args&&... args) {
// not sure how to do here with C++11/14
}
// caller side
int simple(float* f1, size_t N) {
// doing something interesting
}
// ideally I would like to call the following:
Foo foo;
size_t n = 10;
convert_invoke(simple, foo, n); // internally calls simple((float*)foo.get(), n);

这里的想法是当参数类型为Foo时,我将进行一些专门的处理,例如获取void*指针并将其转换为simple中定义的相应参数类型。如何在convert_invoke中实现这一点?

你可以做这样的事情:

// Wrapper to allow conversion to expected pointer.
struct FooWrapper
{
void* p;
// Allow conversion to any pointer type
template <typename T>  
operator T* () { return (T*) p; }
};
// Identity function by default
template <typename T>
decltype(auto) convert(T&& t) // C++14
// auto convert(T&& t) -> decltype(std::forward<T>(t)) // C++11
{ return std::forward<T>(t); }
// special case for Foo, probably need other overloads for Foo&& and cv versions
auto convert(Foo& foo) { return FooWrapper{foo.get()}; }
// Your function
template <typename F, typename... Args>
auto convert_invoke(F&& f, Args&&... args) {
return f(convert(std::forward<Args>(args))...);
}

演示

最新更新