1

我看过这个答案你能在 C++ 中制作自定义运算符吗?并尝试使用一些代理对象来实现由 <power> 表示的自定义幂运算符。但是,我有一个非常奇怪的错误,它使我的程序仅在我打印出一个变量(定义中的变量 x class PowerExpression)时才起作用。

这是我的代码:

//
//  Power.hpp
//  Draft1.0
//
//  Created by CYRUS LINDEN on 1/1/21.
//  Copyright © 2021 CYRUS LINDEN. All rights reserved.
//

#ifndef Power_hpp
#define Power_hpp

#include <stdio.h>
//
//  Power.hpp
//  Experiments
//
//  Created by CYRUS LINDEN on 1/1/21.
//  Copyright © 2021 CYRUS LINDEN. All rights reserved.
//
#include <cmath>
#include <iostream>
const struct power_ {} power;

template <typename T>
struct PowerProxy
{
    PowerProxy(const T& t): t_(t) {}
    const T& t_;
    inline operator T() const {
        return t_;
    }
};
template <typename T>
class BasePowerExpression;
template <typename T, typename U>
class PowerExpression {
public:
    PowerExpression(const T& lhs, const U& rhs) : lhs_(lhs) , rhs_(rhs) {}
public:
    const T& lhs_;
    const U& rhs_;
    inline operator T() const {
        //std::cout << typeid(rhs_).name();
        const T& x = static_cast<T>(rhs_);
        // THIS IS THE LINE THAT CAUSES THE BUG. IF IT IS REMOVED, THE ANSWER IS 0.
        std::cout << x << '\n';
        
        return std::pow(lhs_, x);
    }
};
template <typename T>
class BasePowerExpression{
public:
    const T& lhs_;
    const T& rhs_;

    BasePowerExpression(const T& lhs, const T& rhs) : lhs_(lhs) , rhs_(rhs) {}
    inline operator T() const {
        return std::pow(lhs_, rhs_);
    }

    
};
template <typename T>
inline auto operator<(const T& lhs, const power_& rhs)
{
    return PowerProxy<T>(lhs);
}

template <typename T>
inline auto operator<(const BasePowerExpression<T>& lhs, const power_& rhs)
{
    return lhs;
}
template <typename T, typename U>
inline auto operator<(const PowerExpression<T , U>& lhs, const power_& rhs)
{
    return lhs;
}


template <typename T>
inline auto operator>(const PowerProxy<T>& lhs, const T& rhs)
{
    return BasePowerExpression(lhs.t_, rhs);
}
template <typename T>
inline auto operator>(const BasePowerExpression<T>& lhs, const T& rhs)
{
    return PowerExpression(lhs.lhs_, BasePowerExpression(lhs.rhs_, rhs));
 ;
    
}
template <typename T, typename U>
inline auto operator> (const PowerExpression<T , U>& lhs, const T& rhs) {

        return PowerExpression(lhs.lhs_, PowerExpression(lhs.rhs_, rhs));
        
}

#endif /* Power_hpp */

当尝试在 main.cpp 中使用它时:


int main() {
   std::cout << (2 <power> 2 <power> 3);
   return 0;

}

这可以很好地编译并且可以正常工作并打印 256 。但是,如果我删除我在定义中打印 x 的行class PowerExpression,这只会打印 0。这很奇怪。我认为我的代码中必须有一些未定义的行为,但我似乎找不到任何行为。有谁可以帮我离开这里吗?

4

0 回答 0