はC++でtype initialisationと一緒にelseを使用するには?
myArbPrec("0.1");
を使用して初期化することができるクラス「myArbPrec」を(例えばそれが任意精度のタイプを表す)を考えます。
私のコードはmyArbPrec
とdouble
の両方と互換性があります。ユーザーはテンプレートを使用して型を設定します。
0.1
など、プログラムで使用されるテンプレートクラスにはいくつかの定数があります。これらの定数は、ユーザーが選択するそれぞれのタイプで表されます。
私の質問は、選択したタイプに応じて初期化されるコードに定数を配置するにはどうすればいいですか?具体的には、myArbPrec
については、myArbPrec("0.1")
と初期化する必要があります。 double
の場合は、double(0.1)
と初期化する必要があります。
問題は、私がmyArbPrec
にのみ、これは潜在的に精度を失って、倍増する最初を変換するので、myArbPrec(0.1)
を使用して、できないことです。したがって、テンプレート引数がT
の場合、T(0.1)
と書くことはできません。しかし、double("0.1")
は構文的に正しくないので、T("0.1")
も使用できません。 typeid(T) == typeid(double)
が作るこれ、常にfalseの場合でも、else
分岐がまだコンパイルされているので、
template<typename T>
T atof(const char * c) {
if (typeid(T) == typeid(double))
return std::atof(c);
else
return T(c);
}
しかし、これは失敗します。
はこれまでのところ、私はこのような何かを書くことで、私の問題にthis answerを適応しようとしましたT
がdouble
であっても失敗します。あなたのatof
機能の
を、あなたがC++ 17を楽しみにすることができ、 '場合でconstexpr'は存在するものです。例:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0292r1.html –