繁体   English   中英

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

[英]Implementing a C++ convert on invoke function

我想使用 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))...);
}

演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM