三行代码  ›  专栏  ›  技术社区  ›  Afshin

手动选择不明确的构造函数

c++
  •  1
  • Afshin  · 技术社区  · 1 周前

    当对函数(成员类函数或自由函数)的调用不明确时,我们可以使用 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); ?

    2 回复  |  直到 1 周前
        1
  •  4
  •   Jeremy Friesner    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));
    

    这通过在参数中显式指定类型来消除构造函数调用的歧义。

        2
  •  2
  •   phuclv Supreeth    1 周前

    为什么不直接转换成正确的类型呢? 1 int 所以在传递给无符号参数时会产生一些“混乱”

    int main() {
        S s;
        s.f(1, (uint8_t)1);
        s.f(1, (uint32_t)1);
        s.f(1, 1U);
    }
    

    Demo on Godlbolt