考虑遵循简单的课程(请不要讨论有用性):
class Container
{
public:
Container(const long long &val); //construct the container with a long long
Container(const long double &val); //construct the container with a long double
Container(const std::string &val); //construct the container with a string
Container(const Container &val); //copy constructor, implemented as copy and swap
//explicit conversions are also included for other data types
explicit operator long long() const; //explicit conversion to long long
private:
int dataType;
void *data;
};
要构建对象,我会打电话:
Container cont(20); //or
Container cont2("some string");
但是编译器告诉我他无法解决对int的模糊构造函数调用。
这引出了我的问题,解决这种模棱两可的最佳和最干净的方法是什么 我应该使用某种模板化的构造函数看起来像这样:
Container<int> cont(20);
或使用显式强制转换或虚拟参数?
模板化的方式看起来像是我可以接受的妥协,但我确信实际的通话看起来会有所不同。
非常感谢任何见解!
答案 0 :(得分:3)
只需为int
添加一个消除歧义的构造函数:
Container(int i)
: Container(static_cast<long long>(i)) // or whichever version you want
// to call
{ }
答案 1 :(得分:0)
您可以使用由类型:
模板化的构造函数class Container {
template <class T> Container (const T& rhs);
};
在Boost中查看“any”的实现,以获得与您想要执行的操作类似的示例: http://www.boost.org/doc/libs/1_58_0/doc/html/boost/any.html