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);
}

... 等等

因此,如果您使用atotwithfloat或 with 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

如果类型出现在参数之一中,则可以重载函数。所以你需要一个 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 回答