3

、、、またはタイプに応じatot()て使用するように実装するにはどうすればよいですか?現在、すべてのタイプに使用されています。atof()atoi()atol()atof()

template<typename T>
T Mtx<T>::atot(const char *s) const
{
    return atof(s);
}

速度が非常に重要であることに注意してください。

4

5 に答える 5

3

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");
}
于 2012-11-29T23:33:26.927 に答える
3

最も簡単な解決策は、専門化することです。

template<>
double Mtx<double>::atot(const char *s) const
{
    return atof(s);
}

template<>
int Mtx<int>::atot(const char *s) const
{
    return atoi(s);
}
于 2012-11-29T23:34:05.940 に答える
3

特殊化とは、特定のタイプに応じて、テンプレートの特別な実装を作成することです。

この場合、これを行うことができます:

template<>
float Mtx<float>::atot(const char *s) const
{
    return atof(s);
}

template<>
int Mtx<int>::atot(const char *s) const
{
    return atoi(s);
}

... 等々

したがって、atotfloatまたはで使用する場合intは、上記の実装が使用されます。その他のタイプについては、すでにお持ちの一般的なタイプが使用されます。

于 2012-11-29T23:34:38.270 に答える
2

なぜあなたがこれを欲しがっているのか私にはよくわかりません。適切なメソッドを呼び出すのも同じくらい簡単なようです。

しかし、次のようなものはどうですか?

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);
}
于 2012-11-29T23:33:59.393 に答える
1

タイプがパラメータの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;
}
于 2012-11-29T23:37:46.753 に答える