如何实现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
withfloat
或 with 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);
}
如果类型出现在参数之一中,则可以重载函数。所以你需要一个 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;
}