Я думаю о том, как сломать эту простую программу, которую я создал. У меня есть блок try-catch
вокруг простого оператора деления, но я не знаю, невозможно ли создать исключение в этом случае.
Это мой класс Values.hpp
, который создает объект, который имеет значение и exception_ptr
. Если указатель исключения для объекта является нулевым, то этот объект является действительным.
#ifndef VALUES_HPP
#define VALUES_HPP
#include <exception>
template <typename T>
class Values
{
public:
Values(T t);
Values(std::exception_ptr e);
bool isValid() const;
T const& getValue() const;
private:
T val;
std::exception_ptr error;
};
template<typename T>
Values<T>::Values(T t) : val{ t }, error{nullptr}
{
}
template<typename T>
Values<T>::Values(std::exception_ptr e)
{
}
template<typename T>
inline bool Values<T>::isValid() const
{
return !error;
}
template<typename T>
inline T const & Values<T>::getValue() const
{
if (!error) return val;
std::rethrow_exception(error);
}
template <typename T0, typename T1>
Values<decltype(std::declval<T0>() / std::declval<T1>())> operator/(Values<T0> const& first, Values<T1> const& second)
{
if (!first.isValid()) return first;
if (!second.isValid()) return second;
try
{
auto answer = fiest.getValue() / second.getValue();
return answer;
}
catch (...) //Is this catch unreachable?
{
return std::current_exception();
}
}
#endif
Вот мой основной класс, который использует объекты Values и оператор деления. Именно в этом классе я хочу иметь возможность что-то изменить, чтобы достичь оператора catch.
#include “Values.h”
#include <string>
int main()
{
Values<int> first(10);
Values<int> second(10);
const auto answer = first / second;
Values<int> third(std::make_exception_ptr(std::string(“test1”)));
Values<int> fourth(10);
const auto answer2 = third / fourth;
}
Есть ли способы достичь этого оператора catch? Или это недоступно. Я не смог найти способ. Допускается добавление дополнительного кода в основной класс.