我会尝试用一个例子更清楚地解释它。我有一个Square,我希望能够用可变维度(例如
)初始化它(宽度,长度)=(int,int)或(double,int)或(double,double)等。
我知道如果我希望我的方块有整数边,我会将其声明为int width
和int height
但是如何声明它以便它可以采用多种形式?
例如:
header.h
class Square
{
public:
// Constructor : Initialise dimensions
Square();
// Set dimensions
template< typename T1, typename T2>
setDim(T1 x, T2 y);
private:
// Is this right ????
template <typename T> T width;
template <typename T> T height;
};
此外,如果我创建广场,我将如何将变量初始化为0。
e.g:
src.cpp
Square::Square()
{
// Would this be correct ???
width = 0;
height = 0;
}
答案 0 :(得分:1)
这是可行的,如果我正确理解问题,你需要两种不同的宽度和高度类型(并注意这是一个矩形,而不是方形,从技术上讲)。
#include <iostream>
template <typename W, typename H>
class Rect {
W width;
H height;
public:
Rect(const W w, const H h): width(w), height(h) {}
Rect(): width(0), height(0) {}
W get_width() { return width; }
H get_height() { return height; }
};
template <typename W, typename H>
void show_rect(Rect<W, H> r)
{
std::cout << r.get_width()
<< "x"
<< r.get_height()
<< "="
<< r.get_width() * r.get_height()
<< std::endl;
}
int main()
{
show_rect(Rect<int, int>{});
show_rect(Rect<double, long>{0.3, 8});
}
您可以看到如何重载构造函数以使用默认值进行初始化。您还可以看到如何编写一个函数,该函数将该类的对象作为参数。
有了这个,我得到:
$ make rect
g++ -std=c++14 -pedantic -Wall -O2 rect.cpp -o rect
$ ./rect
0x0=0
0.3x8=2.4
但我真的不确定这样做的智慧。我相信有人会在评论中解释:)