代码之家  ›  专栏  ›  技术社区  ›  Antoine Morrier

模板类型之间的隐式转换

  •  5
  • Antoine Morrier  · 技术社区  · 5 年前

    我创造了两种类型: bool_t number_t 我想用两种方法把一种转化成另一种。但是,我有一些问题要转换 布尔洛 变成一个 数字编号 .

    基本上我想做的是(但它不编译):

    template<bool v>
    struct bool_t {
        template<template<int> typename T>
        operator T<v ? 1 : 0>() {
            return {};
        }
    };
    
    template<int N>
    struct number_t {
    template<int n1, int n2>
    friend number_t<n1 + n2> operator+(number_t<n1>, number_t<n2>) {
      return {};
    }
    };
    
    
    int main() {
        number_t<0>{} + bool_t<0>{};   
    }
    

    错误是:

    prog.cc:19:19: error: invalid operands to binary expression ('number_t<0>' and 'bool_t<0>')
        number_t<0>{} + bool_t<0>{};   
        ~~~~~~~~~~~~~ ^ ~~~~~~~~~~~
    prog.cc:12:26: note: candidate template ignored: could not match 'number_t' against 'bool_t'
    friend number_t<n1 + n2> operator+(number_t<n1>, number_t<n2>) {
                             ^
    1 error generated.
    

    如何解决这个问题?

    2 回复  |  直到 5 年前
        1
  •  3
  •   aschepler    5 年前

    template <int> struct X {};
    struct Y {
        operator X<2> () const { return {}; }
    };
    template <int N>
    void f(X<N>) {}
    
    int main()
    {
        Y y;
        f(y); // Error: Cannot deduce template argument.
    }
    

    #include <type_traits>
    
    template<bool v>
    struct bool_t {
        // (Add some appropriate SFINAE.)
        template<template<int> typename T>
        constexpr T<v ? 1 : 0> convert_template() const {
            return {};
        }
    };
    
    template<typename T, template<int> class TT>
    struct type_specializes : std::false_type {};
    
    template<template<int> class TT, int N>
    struct type_specializes<TT<N>, TT> : std::true_type {};
    
    template<int N>
    struct number_t {
        // Allow "conversion" to my own template:
        template<template<int> typename T>
        constexpr std::enable_if_t<type_specializes<number_t, T>::value, number_t>
        convert_template() const { return {}; }
    
    private:
        // Used only in decltype; no definition needed.
        template<int n1, int n2>
        static number_t<n1 + n2> sum_impl(number_t<n1>, number_t<n2>);
    
        template<typename T1, typename T2>
        friend auto operator+(T1&& x, T2&& y)
            -> decltype(number_t::sum_impl(
                 x.template convert_template<number_t>(),
                 y.template convert_template<number_t>()))
        { return {}; }
    };
    
    int main() {
        number_t<0>{} + bool_t<0>{};   
    }
    

    bool_t operator+

        2
  •  2
  •   darune    5 年前

    number_t<n1 + n2> operator+(number_t<n1>, bool_t<n2>) {
      //return something
    }