类型转换感知数字文字

时间:2013-12-29 17:00:27

标签: c++

据我所知,不同的数字文字在C和C ++中有不同的类型。例如:

  • 0的类型为int
  • 0u的类型为unsigned int
  • 0.0的类型为double
  • 0.0f的类型为float

因此,如果使用文字值初始化变量,则该文字的类型必须与变量相同,否则执行类型转换以执行分配:

int i = 0.0;

这似乎是一个愚蠢的转换,并且因为在编译时知道文字的值,编译器可以轻松地避免该转换,只需以正确的格式(有符号整数而不是浮点数)分配值。这个例子)。

我的问题非常简单:保证任何体面的(或至少任何现代编译器,我使用的是GCC 4.8.2)都会忽略转换?

我正在为代数编写几个泛型类,我担心使用文字进行初始化,如下所示:

template<typename T>
struct vector_2d
{
    T x , y;

    vector_2d( T xx , T yy ) : x( xx ) , y( yy ) {}

    //Initializations like this:
    vector_2d() : vector_2d( 0 , 0 ) {}
};

因为我不知道哪种类型是T,所以当类型为0.0f时我无法使用float,依此类推。当然,我不会编写模板特化来捕获不同类型的参数:P

1 个答案:

答案 0 :(得分:3)

您可以使用值初始化来获得相应类型的“零”值。

vector_2d() : vector_2d( T() , T() ) {}

vector_2d() : x(), y() {}

当然,这只适用于零。对于其他值,您可能需要{Nikisy评论的constexpr函数模板。

template<typename TResult, typename TFrom>
constexpr TResult compiletime_conversion(const TFrom val)
{
    TResult result = val;
    return result;
}