我看过这个答案你能在 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。这很奇怪。我认为我的代码中必须有一些未定义的行为,但我似乎找不到任何行为。有谁可以帮我离开这里吗?