如何确定模板的返回类型?

时间:2018-09-15 10:27:45

标签: c++

我有以下功能:

template<class F>
struct c_style_callback_t {
  F f;
  template<class...Args>
  static void(*get_callback())(Args..., void*) {
    return [](Args...args, void* fptr)->void {
      (*static_cast<F*>(fptr))(std::forward<Args>(args)...);
    };
  }
  void* get_pvoid() {
    return std::addressof(f);
  }
};

template<class F>
c_style_callback_t< std::decay_t<F> >
c_style_callback( F&& f ) { return {std::forward<F>(f)}; }

我一直在使用它,

auto task = c_style_callback(
  [=] (Foo *foo, char *bar) { ... }
);

但是现在我想将task存储在vector<???>中。这里需要使用什么类型?

我试图将auto更改为int,以便编译器显示有关无法转换内容的错误。我从那里复制粘贴了该类型,替换了int,但是没有用。

故意看到编译器期望的错误类型

error: cannot convert 'c_style_callback_t<SomeClass::subscribe(const string&, std::function<void(const std::__cxx11::basic_string<char>&)>, QoS)::<lambda(Foo*, char*)> >' to 'int' in initialization

已替换auto

c_style_callback_t<SomeClass::subscribe(const string&, std::function<void(const std::__cxx11::basic_string<char>&)>, QoS)::<lambda(Foo*, char*)> > task2 = c_style_callback(
  [=] (Foo *foo, char *bar) { }
);

新错误:

error: template argument 1 is invalid
 c_style_callback_t<SomeClass::subscribe(const string&, std::function<void(const std::__cxx11::basic_string<char>&)>, QoS)::<lambda(Foo*, char*)> > task2 = c_style_callback(
 error: cannot convert 'c_style_callback_t<SomeClass::subscribe(const string&, std::function<void(const std::__cxx11::basic_string<char>&)>, QoS)::<lambda(Foo*, char*)> >' to 'int' in initialization

2 个答案:

答案 0 :(得分:2)

据我了解,您需要了解c_style_callback的类型,才能将c_style_callback的任何实例存储到向量中。

要了解您可以执行的任务类型

#include <iostream>
#include <vector>
template<class F>
struct c_style_callback_t {
    F f;
    template<class...Args>
    static void(*get_callback())(Args..., void*) {
        return [](Args...args, void* fptr)->void {
            (*static_cast<F*>(fptr))(std::forward<Args>(args)...);
        };
    }
    void* get_pvoid() {
        return std::addressof(f);
    }
};

template<class F>
c_style_callback_t< std::decay_t<F> >
c_style_callback(F&& f) { return { std::forward<F>(f) }; }
int main()
{
    auto task = c_style_callback(
        [=](double *foo, char *bar) {  }
    );
    std::cout << typeid(decltype(task)).name() << std::endl;

    std::vector<decltype(task)> v;

    v.push_back(task);
    return 0;
}

此代码返回(在Visual Studio 2017上)

struct c_style_callback_t<class <lambda_f2990127907fab7e430587a3832f9637> >

然后您看到问题开始了。 Lambda表达式具有唯一的类型,请参见Can the 'type' of a lambda expression be expressed?

答案 1 :(得分:0)

这需要C ++ 14。

创建一个返回自动回调函数的函数。

import re
Birthday = str(input("insert your birth<(ex) xxxxy **m 00d> : "))
p= re.sub('[ymd ]','',Birthday)
print(p) #result is "xxxx**00"

然后可以创建函数的十进制类型的向量:

auto create_callback(/**/)
{
    return c_style_callback([=](Foo* foo, char* bar) { //...
    });
}

然后可以这样做:

std::vector< decltype(create_callback()) > vec;
相关问题