#include <boost/exception/all.hpp>
#include <iostream>
struct myexception : virtual boost::exception, virtual std::exception {};
typedef boost::error_info<struct tag_info, std::string> info;
void main()
{
try
{
BOOST_THROW_EXCEPTION(myexception()
<< info("1")
<< info("2") );
}
catch(const myexception& e)
{
std::cout << boost::diagnostic_information(e) << std::endl;
}
}
これは出力されます
[struct tag_info *] = 2
これが事実である理由は理解していますが、むしろ出力したいと思います
[struct tag_info *] = 1
[struct tag_info *] = 2
もちろん、typedef
asinfo
を実行し、例外にシフトする前にboost::error_info<struct tag_info, std::vector<std::string> >
すべての情報を a に蓄積することもできますstd::vector
が、これには 2 つの欠点があります
。 、つまり、単純にシフト演算子を使用して情報を追加することはできません。
error_info
したがって、同じタイプの複数の情報を例外に追加するためのより良い解決策を探しています。
編集:
ジョシュ・ケリーが以下のコメントで提案したように、オーバーロードしてみましたoperator <<
:
#include <boost/exception/all.hpp>
#include <iostream>
#include <vector>
typedef boost::error_info<struct tag_info, std::string> info;
typedef boost::error_info<struct tag_multiple_infos, std::vector<std::string> > multiple_infos;
struct myexception : virtual boost::exception, virtual std::exception
{
myexception& operator<< (const info& rhs)
{
std::vector<std::string>* pinfos = boost::get_error_info<multiple_infos, myexception>(*this);
if (pinfos != NULL)
{
pinfos->push_back(rhs.value());
}
else
{
std::vector<std::string> infos;
infos.push_back(rhs.value());
*this << multiple_infos(infos);
}
return *this;
}
};
std::string to_string(const multiple_infos& info)
{
std::ostringstream oss;
std::for_each(info.value().begin(), info.value().end(),
[&oss](const std::string& str) { oss << str << ' '; });
return oss.str();
}
void main()
{
try
{
BOOST_THROW_EXCEPTION(myexception()
<< info("1")
<< info("2") );
}
catch(const myexception& e)
{
std::cout << boost::diagnostic_information(e) << std::endl;
}
}
それは出力します
[struct tag_multiple_infos *] = 1 2
それはいいことですが、Pyotrs の回答の方が私にはより自然に見え、必要なコードが少ないため、Pyotrs の回答の方が良いと思います。info
ただし、複数のキャッチ サイト1に s を追加したい場合は、既に追加した情報の数を知る必要がないため、このソリューションがより適しています。
1 = つまり、情報を例外にシフトし、スローし、別の場所でキャッチし、さらに情報をシフトしてから再スローします。