当前位置: 首页 > 知识库问答 >
问题:

如何显式调用指定的重载函数?

宦炜
2023-03-14
#include <cstdio>
#include <string>
constexpr char str[] = "/home/qspace/etc/client/mmkvcfgsvr_test_byset_cli.conf";

void test(bool a)
{
    printf("b=%d",a);
}

void test(const std::string& s){
    printf("s=%s",s.c_str());
}
int main()
{
  test(str);
  return 0;
}

像这段代码一样,C编译器将把char*转换为bool,然后调用第一个函数,这与我的初衷不一致。有没有办法阻止编译器执行我不想要的类型转换?比如“-fno permissive”,但不幸的是,它不起作用。

共有2个答案

巴照
2023-03-14

您混合了C和STL类型(char数组与std::string)。有两种解决办法。最明显的解决方案是,每次希望将字符数组传递到需要std::string的函数时,都要创建一个临时std::string对象。

test(std::string(str));

我更喜欢的另一个解决方案是完全避免C类型。要创建字符串常量,直接使用STL类型:

const std::string str {"/home/qspace/etc/client/mmkvcfgsvr_test_byset_cli.conf"};

如果您希望保留constexpr请参阅此线程:是否可以在constexpr中使用std::string?

包阳成
2023-03-14

如何显式调用指定的重载函数?

  • 在调用站点转换参数:test(std::string(str))
  • 获取重载函数的预期地址:static\u cast

有没有办法阻止编译器执行我不想要的类型转换?

您可以添加一个catch-all重载作为已删除:模板

或者,在C 17中,您可以手动执行“分派”:

template <typename T>
void test(const T& t)
{
    static_assert(std::is_constructible_v<std::string, T>
               || std::is_convertible_v<T, bool>);

    if constexpr (std::is_constructible_v<std::string, T>) {
        const std::string& s = t;
        printf("s=%s", s.c_str());
    } else if constexpr (std::is_convertible_v<T, bool>) {
        printf("b=%d", bool(t));
    }
}

 类似资料:
  • 在c语言中,对分配了new的对象调用delete,调用类的析构函数,并释放内存。如果不删除对象,而是显式调用其析构函数,然后释放内存,会有什么不同吗? 例如,考虑以下示例。 用7.3.0和6.0.1以及Wextra-Wall-pedantic编译代码不会产生任何警告。正如预期的那样,程序的输出是 使用/运行程序会出现不匹配的释放/删除错误: 但是,没有内存泄漏。 我当然知道,在上面的代码中处理对象

  • Java泛型类型推断的Oracle文档给出了以下示例: 考虑类MyClass的以下实例化:

  • 我在TypeScript中有一个React组件,看起来像这样: 我希望能够指定我的propTypes()中的函数使用对象,但我不知道怎么做。

  • 问题内容: 经典(非js)重载方法: Javascript不允许使用同一个名称定义多个功能。这样,这样的事情就会出现: 除了传递带有重载的对象之外,JavaScript中是否有更好的解决方法来实现函数重载? 传递重载会很快导致函数变得过于冗长,因为每个可能的重载都需要一个条件语句。使用函数来完成那些条件语句的内部会导致带有范围的棘手情况。 问题答案: Javascript中的参数重载有多个方面:

  • 现在,我需要在BDD中编写一个场景,然后使用cucumber编写测试,以测试这个用BDD语法编写的场景。 对于编写场景,我可以想到两个选项。 > 编写一个捕获方程中所有细节的单一场景,这样方程本身就可以从场景中导出。

  • 问题内容: 假设我有以下重载函数 为什么要调用带有参数签名的方法?这里重载的优先顺序是什么? 问题答案: 在这种情况下,类层次结构中较低的类将具有优先权。换句话说,更具体的类类型,在这种情况下将是因为从技术上扩展了。 如果您有以下内容 然后,当您定义如下的重载方法时: 然后调用将调用第二个方法,因为它在类层次结构中较低。