我有一个类,它使用静态列表(示例中为firstFriend)或动态列表(示例中为secondFriend)进行初始化。我不想为该示例编写的列表功能,因为它并不重要。关键问题是,第一个朋友和第二个朋友是好朋友。类“target”的构造函数的代码是相同的:如果我重载构造函数,我正在复制完全相同的代码。我无法模拟构造函数,因为它不起作用。
这是示例(注意:firstFriend和secondFriend看起来可能相同,但它们在ACTUAL代码中不一样,这只是一个大大减少的模型,它们的属性和功能之间的差异没有任何不同之处“target”类构造函数,因为公共接口的各个部分都使用两个完全相同的类:)
template <class T>
class firstFriend
{
public:
firstFriend() {};
firstFriend(const T& t) {};
private:
T tAttribute;
};
template <class T>
class secondFriend
{
public:
secondFriend() {};
secondFriend(T t) : tAttribute(t) {};
friend class firstFriend<T>;
private:
T tAttribute;
};
class target
{
public:
target(const firstFriend<int>&)
{
// Some nice initialization of the TargetData.
}
target(const secondFriend<int>&)
{
// Exactly the same initialization as above.
// To the single character.
};
private:
firstFriend<int> TargetData;
};
问题:如何在不编写(复制/粘贴)相同代码两次的情况下重载构造函数?我试过模板构造函数,但它不起作用。隐性演员可能吗?什么是最有效的方式(firstFriend和secondFriend是巨大的数据列表)。提前谢谢!
答案 0 :(得分:1)
如果两个构造函数具有完全相同的代码,则可以将构造函数模板编写为:
template<class FriendType >
target(const FriendType &)
{
// Some nice initialization of the TargetData.
}
如果存在一点差异,但大多数代码相同,那么您可以编写init
模板函数,并从两个构造函数中调用它:
target(const firstFriend<int>& arg)
{
init(arg);
//other code
}
target(const secondFriend<int>& arg)
{
init(arg);
//other code
}
private:
template<class FriendType >
void init(const FriendType &)
{
//common code
}