gpt4 book ai didi

c++ - 使用 std::function 的重载函数解析:帮助编译器消除歧义

转载 作者:搜寻专家 更新时间:2023-10-31 01:39:18 25 4
gpt4 key购买 nike

我想从重载的模板函数创建一个 std::function。使用 g++ -std=c++14 编译时出现重载解析错误。我有一个 hack 可以将函数模板按摩成编译器可以识别的形式,但我想知道是否有更优雅的方法。下面是说明错误和我的破解的代码,

#include <functional>

template <typename T>
T foo(T t) { return t; }

template <typename T>
T foo(T t1, T t2){ return t1 + t2; }

int main (){
//error: conversion from ‘<unresolved overloaded function type>’
//to non-scalar type ‘std::function<double(double)>’ requested
std::function<double(double)> afunc = &foo<double>;

//my workaround to 'show' compiler which template
//function to instantiate
double (*kmfunc1)(double) = &foo<double>;
std::function<double(double)> afunc = kmfunc1;
}

我有两个问题

  • 我期望编译器决定使用哪个模板是不合理的吗?
  • 在上述情况下,创建 std::function 最优雅的方法是什么?

最佳答案

#define OVERLOAD_SET(...) \
[](auto&&...args)-> \
decltype(__VA_ARGS__(decltype(args)(args)...)) \
{ \
return __VA_ARGS__(decltype(args)(args)...); \
}

创建一个表示其参数的完整(全局)重载集的单个对象。 (我使用 ... 因为宏不理解现代 C++ 中 , 的所有用法)

std::function<double(double)> afunc = OVERLOAD_SET(foo<double>);
std::function<double(double,double)> bfunc = OVERLOAD_SET(foo<double>);

两者都应该有效,应该有效

std::function<double(double)> afunc = OVERLOAD_SET(foo);
std::function<double(double,double)> bfunc = OVERLOAD_SET(foo);

当我们在做的时候。这里的想法是我们将重载决策推迟到确定参数的时候。

OVERLOAD_SET(foo) 编译为:

[](auto&&...args)
->decltype(foo(decltype(args)(args)...))
{
return foo(decltype(args)(args)...);
}

这是一个无状态的 lambda,它返回在其参数上调用 foo 会做的任何事情。它使用完美转发,但有其通常的缺陷。

关于c++ - 使用 std::function 的重载函数解析:帮助编译器消除歧义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31429127/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com