gpt4 book ai didi

c++ - 如何为同一类型提供隐式和显式转换 ctr?

转载 作者:可可西里 更新时间:2023-11-01 16:12:53 27 4
gpt4 key购买 nike

给定一个简单的 template <typename T> struct X { T x, y; }; ,我想提供转换构造函数,以便用户可以编写:

X<double> a;
X<int16_t> b = a; // uses implicit conversion ctr (compiles with warning)
X<int16_t> c(a); // uses explicit conversion ctr (compiles w/o warning)
X<int32_t> d = c; // uses implicit conversion ctr (compiles w/o warning)

我相信为了实现这个目标,我需要同时实现类型 U 的隐式和显式转换构造函数.但是不可能在“隐式”和 explicit 上重载:

template <typename T> struct X {
X(T x = T(), T y = T()) : x(x), y(y) {}

// implicit conversion
template <typename U>
X(const X<U>& other) : x(other.x), y(other.y) {}

// not possible!
template <typename U>
explicit X(const X<U>& other)
: x(static_cast<T>(other.x))
, y(static_cast<T>(other.y))
{}

T x, y;
};

我怎样才能实现这个目标(我想我不能......)?

我最初的想法是, 我需要根据 is_lossless_convertible 启用/禁用一个或另一个.那么有没有合适的type trait呢?

我想测试一个标量类型是否为U可转换为 T 类型不损失精度:

using namespace std;
static_assert(is_lossless_convertible<int16_t, int32_t>::value == true);
static_assert(is_lossless_convertible<int32_t, int16_t>::value == false);
static_assert(is_lossless_convertible<int16_t, uint32_t>::value == false);
static_assert(is_lossless_convertible<int32_t, double>::value == true);
static_assert(is_lossless_convertible<double, int32_t>::value == false);

简而言之,它应该产生 true如果 std::is_convertible<U, T>::value == true 如果 U x; T y = x;不会发出有关信息丢失的编译器警告。

最佳答案

你不能重载显式,但你可以提供显式转换构造函数和隐式转换运算符:

#include <iostream>
template<typename T> struct S {
S() {}
template<typename U> explicit S(const S<U> &) { std::cout << "explicit\n"; }
template<typename U> operator S<U>() { return S<U>(this); }
private:
template<typename U> friend struct S;
template<typename U> S(const S<U> *) { std::cout << "implicit\n"; }
};

int main() {
S<double> sd;
S<int> si1(sd);
S<int> si2 = sd;
}

输出:

explicit
implicit

使用 gcc 和 clang 测试。

显式转换构造函数优于隐式转换运算符,因为在后一种情况下,会额外(可能省略)调用 S<int> 的复制构造函数。 .

关于c++ - 如何为同一类型提供隐式和显式转换 ctr?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13856388/

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