如何显式调用指定的重载函数?
How to explicitly call the specified overload function?
#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”,但不幸的是,它不起作用。
您正在混合使用 C 和 STL 类型(字符数组与 std::string)。有两种解决方法。立即显而易见的解决方案是每次您希望将 char 数组传递给期望 std::string.
的函数时创建一个临时 std::string 对象
test(std::string(str));
另一个我更喜欢的解决方案是完全避免使用 C 类型。创建字符串常量,直接使用STL类型:
const std::string str {"/home/qspace/etc/client/mmkvcfgsvr_test_byset_cli.conf"};
如果您希望保留 constexpr
请参阅此主题:Is it possible to use std::string in a constexpr?
How to explicitly call the specified overload function?
- 在调用点转换参数:
test(std::string(str));
- 取重载函数的预期地址:
static_cast<void(*)(const std::string&)>(print)(str);
Is there any way to prevent the compiler from performing type conversions that I don't want?
您可以添加一个已删除的包罗万象的重载:template <typename T> void test(const T&) = delete;
或者,在 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));
}
}
#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”,但不幸的是,它不起作用。
您正在混合使用 C 和 STL 类型(字符数组与 std::string)。有两种解决方法。立即显而易见的解决方案是每次您希望将 char 数组传递给期望 std::string.
的函数时创建一个临时 std::string 对象test(std::string(str));
另一个我更喜欢的解决方案是完全避免使用 C 类型。创建字符串常量,直接使用STL类型:
const std::string str {"/home/qspace/etc/client/mmkvcfgsvr_test_byset_cli.conf"};
如果您希望保留 constexpr
请参阅此主题:Is it possible to use std::string in a constexpr?
How to explicitly call the specified overload function?
- 在调用点转换参数:
test(std::string(str));
- 取重载函数的预期地址:
static_cast<void(*)(const std::string&)>(print)(str);
Is there any way to prevent the compiler from performing type conversions that I don't want?
您可以添加一个已删除的包罗万象的重载:template <typename T> void test(const T&) = delete;
或者,在 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));
}
}