、、、またはタイプに応じatot()
て使用するように実装するにはどうすればよいですか?現在、すべてのタイプに使用されています。atof()
atoi()
atol()
atof()
template<typename T>
T Mtx<T>::atot(const char *s) const
{
return atof(s);
}
速度が非常に重要であることに注意してください。
、、、またはタイプに応じatot()
て使用するように実装するにはどうすればよいですか?現在、すべてのタイプに使用されています。atof()
atoi()
atol()
atof()
template<typename T>
T Mtx<T>::atot(const char *s) const
{
return atof(s);
}
速度が非常に重要であることに注意してください。
boost::lexical_cast<T>
基本的にこれを行う必要があります
template<typename T>
T Mtx<T>::atot(const char *s) const
{
return boost::lexical_cast<T>(s);
}
デモ:
#include <boost/lexical_cast.hpp>
template<typename T>
T atot(const char *s)
{
return boost::lexical_cast<T>(s);
}
int main()
{
auto i = atot<int>("3");
auto d = atot<double>("-INF");
auto f = atot<double>("314e-2");
auto ul = atot<unsigned long>("65537");
}
最も簡単な解決策は、専門化することです。
template<>
double Mtx<double>::atot(const char *s) const
{
return atof(s);
}
template<>
int Mtx<int>::atot(const char *s) const
{
return atoi(s);
}
特殊化とは、特定のタイプに応じて、テンプレートの特別な実装を作成することです。
この場合、これを行うことができます:
template<>
float Mtx<float>::atot(const char *s) const
{
return atof(s);
}
template<>
int Mtx<int>::atot(const char *s) const
{
return atoi(s);
}
... 等々
したがって、atot
とfloat
またはで使用する場合int
は、上記の実装が使用されます。その他のタイプについては、すでにお持ちの一般的なタイプが使用されます。
なぜあなたがこれを欲しがっているのか私にはよくわかりません。適切なメソッドを呼び出すのも同じくらい簡単なようです。
しかし、次のようなものはどうですか?
void atot(const char *s, float& result)
{
result = atof(s);
}
void atot(const char *s, long& result)
{
result = atol(s);
}
void atot(const char *s, int& result)
{
result = atoi(s);
}
タイプがパラメータの1つに含まれている場合は、関数をオーバーロードできます。したがって、戻り値の代わりにoutパラメータが必要になります。
void atonum(const char*, int&);
void atonum(const char*, long&);
void atonum(const char*, float&);
これが気に入らない場合は、テンプレートの特殊化を使用できます。これに関する他の回答を参照してください。
または、オーバーロードをラッパーテンプレートと組み合わせることができます。
template<typename T> void atonum(const char* a)
{
T tmp;
atonum(a, tmp);
return tmp;
}
しかし、それでも特殊なテンプレートと同じように呼び出すのは醜いです。
型変換演算子をオーバーロードすることで、呼び出し元にとってより良い構文を取得できます。コンセプトの証明:
#include <cstdio>
#include <cstdlib>
struct atonum
{
atonum(const char* a):m_a(a){}
operator int(){printf("int\n"); return atoi(m_a);}
operator long(){printf("long\n"); return atol(m_a);}
operator float(){printf("float\n"); return atof(m_a);}
private:
const char* m_a;
};
int main(int argc, const char* argv[])
{
int i = atonum("1");
long l = atonum("2");
float f = atonum("3.0");
return i+l+f;
}