Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将已推导的类型作为回调的参数类型传递_C++_Templates_Type Deduction - Fatal编程技术网

C++ 将已推导的类型作为回调的参数类型传递

C++ 将已推导的类型作为回调的参数类型传递,c++,templates,type-deduction,C++,Templates,Type Deduction,所以我想做以下事情 intx=123; myFunction(x,[](自动y){ 标准::cout 是否可能以某种方式将回调参数排除在推导之外,而只使用推导出的val类型 当然 如果你这样定义的话 template <typename T> struct self { using type = T; }; 现在,T是从val推导出来的,用于回调 从C++20开始,您可以避免使用self定义,并使用新引入的 模板 void myFunction(T val,void(*回调)(s

所以我想做以下事情

intx=123;
myFunction(x,[](自动y){
标准::cout
是否可能以某种方式将回调参数排除在推导之外,而只使用推导出的val类型

当然

如果你这样定义的话

template <typename T>
struct self
 { using type = T; };
现在,
T
是从
val
推导出来的,用于
回调

从C++20开始,您可以避免使用
self
定义,并使用新引入的

模板
void myFunction(T val,void(*回调)(std::type_identity_T)){
回调(val);
} 
一个选项(还有一些)是将可调用项作为模板参数传递,并允许模板处理为您处理一些细节-例如:

template <typename T, typename FUNCTOR>
void myFunction(T val, FUNCTOR callback) {
    callback(val);
}

// Note: could be a const ref:
//void myFunction(T val, const FUNCTOR &callback) {


int main()
{

    int some_int{1};
    myFunction(some_int, [](auto y){ std::cout << y << std::endl; });

    float some_float{1.1f};
    myFunction(some_float, [](auto y){ std::cout << y << std::endl; });

    return 0;
}
模板
void myFunction(T val,FUNCTOR回调){
回调(val);
}
//注:可能是常量参考:
//void myFunction(T val、常量FUNCTOR和回调){
int main()
{
int some_int{1};

myFunction(某些整数,[](自动y){std::cout谢谢。这肯定会起作用,但问题是回调类型未知,因此IDE IntelliSense将不知道该类型是什么,并且无法自动完成该类型的成员,等等。@max66建议使IntelliSense知道该类型。@PeterBechP是的,这很可能是真的!-尽管我认为有一些模板intellisense在最新的vsode/msvs中推出(或即将推出)。我稍微喜欢这种方法,只是因为它非常简单,如果您更改传入的内容,则不需要重构(至少在函数模板中),等等……排序:简单性+可维护性vs intellisense我猜:)Functor方式允许捕获lambda:-)(但预期的签名确实不可见:-/,
std::function
有开销)。
template <typename T>
void myFunction(T val, void(*callback)(std::type_identity_t<T>)) {
    callback(val);
} 
template <typename T, typename FUNCTOR>
void myFunction(T val, FUNCTOR callback) {
    callback(val);
}

// Note: could be a const ref:
//void myFunction(T val, const FUNCTOR &callback) {


int main()
{

    int some_int{1};
    myFunction(some_int, [](auto y){ std::cout << y << std::endl; });

    float some_float{1.1f};
    myFunction(some_float, [](auto y){ std::cout << y << std::endl; });

    return 0;
}