簡體   English   中英

static_cast 和模板化轉換 function

[英]Static_cast and templated conversion function

我有一個 class 包裝某種類型並附加一個維度。 它應該可以轉換為基礎類型,但前提是Dim=0 在其他情況下,轉換運算符不應該是可調用的(因此 function 中的static_assert對我不起作用)。

如果enable_if -construction 被刪除,則以下代碼有效,但不是這種形式。

template<class T, int Dim>
class Unit {
    public:
    explicit Unit(T const& value): _value(value) {}

    template<int D = Dim, typename = typename std::enable_if<D == 0>::type>
    operator T() { return _value; }
    private:
    T _value;
};

auto main() -> int
{
    auto a = double{0};
    auto u = Unit<double, 0>{a};
    auto i = static_cast<int>(u);    
    return i;
}  

這是什么原因,是否有解決方法來允許演員,但也限制轉換?

據我了解,您想要:

template <class T, int Dim>
class Unit {
public:
    explicit Unit(T const& value): _value(value) {}

    template <typename U, int D = Dim,
              std::enable_if_t<D == 0 && std::is_convertible_v<T, U>, int> = 0>
    operator U() { return _value; }
private:
    T _value;
};

演示

而在 C++20 中,看起來更好

template<class T, int Dim>
class Unit {
    public:
    explicit Unit(T const& value): _value(value) {}

    template <typename U>
    requires(Dim == 0 && std::is_convertible_v<T, U>)
    operator U() const { return _value; }
private:
    T _value;
};

演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM