手动选择不明确的构造函数
Selecting ambiguous constructor manually
当函数调用(成员 class 函数或自由函数)不明确时,我们可以 select 轻松使用 static_cast<>
我们调用的函数类型:
struct S {
void f(uint32_t, uint8_t) {
std::cout << "1\n";
}
void f(uint32_t, uint32_t) {
std::cout << "2\n";
}
};
int main() {
S s;
auto f1 = static_cast<void(S::*)(uint32_t, uint8_t)>(&S::f);
(s.*f1)(1,1);
auto f2 = static_cast<void(S::*)(uint32_t, uint32_t)>(&S::f);
(s.*f2)(1,1);
}
但我想知道是否可以为构造函数做类似的事情。例如,在以下结构中:
struct S {
S(uint32_t, uint8_t) {
std::cout << "1\n";
}
S(uint32_t, uint32_t) {
std::cout << "2\n";
}
};
是否可以手动解决创建 S s(1,1);
的模糊构造函数调用?
这是你想要的吗?
S s1(static_cast<uint32_t>(1), static_cast<uint32_t>(2));
S s2(static_cast<uint32_t>(1), static_cast<uint8_t>(2));
这通过在参数中明确指定类型来消除构造函数调用的歧义。
为什么不转换为正确的类型? 1
是一个 int
文字,因此在传递给无符号参数时会造成一些“混淆”
int main() {
S s;
s.f(1, (uint8_t)1);
s.f(1, (uint32_t)1);
s.f(1, 1U);
}
当函数调用(成员 class 函数或自由函数)不明确时,我们可以 select 轻松使用 static_cast<>
我们调用的函数类型:
struct S {
void f(uint32_t, uint8_t) {
std::cout << "1\n";
}
void f(uint32_t, uint32_t) {
std::cout << "2\n";
}
};
int main() {
S s;
auto f1 = static_cast<void(S::*)(uint32_t, uint8_t)>(&S::f);
(s.*f1)(1,1);
auto f2 = static_cast<void(S::*)(uint32_t, uint32_t)>(&S::f);
(s.*f2)(1,1);
}
但我想知道是否可以为构造函数做类似的事情。例如,在以下结构中:
struct S {
S(uint32_t, uint8_t) {
std::cout << "1\n";
}
S(uint32_t, uint32_t) {
std::cout << "2\n";
}
};
是否可以手动解决创建 S s(1,1);
的模糊构造函数调用?
这是你想要的吗?
S s1(static_cast<uint32_t>(1), static_cast<uint32_t>(2));
S s2(static_cast<uint32_t>(1), static_cast<uint8_t>(2));
这通过在参数中明确指定类型来消除构造函数调用的歧义。
为什么不转换为正确的类型? 1
是一个 int
文字,因此在传递给无符号参数时会造成一些“混淆”
int main() {
S s;
s.f(1, (uint8_t)1);
s.f(1, (uint32_t)1);
s.f(1, 1U);
}