通用/动态类型作为参数C / C ++

时间:2016-05-01 20:28:46

标签: c++

我想实现这样的目标:

class Test {
    Test() {}
    Test(generalObject a){
       // do something
    }
}

int main(){
    Test a = 5;
    Test b = "A";
    Test c = true;
}

我想要的解决方案是否可以实现这一目标?

generalObject也可以是任何其他类型,不需要是类类型。当然我知道我可以为不同的类型编写不同的运算符,但我想跳过那个阶段。

2 个答案:

答案 0 :(得分:2)

这些:

Test a = 5;
Test b = "A";
Test c = true;
Test d = Test();

不是作业,而是copy initializations。编译器查找非显式构造函数(包括最后一个语句的复制构造函数)。

代码中不需要operator=

由于您没有对传递的参数执行任何操作,因此会出现这种情况(仅用于编译代码):

struct Test {
    Test() = default;

    template <typename T> // a constructor template
    Test(T const&) {}
};

C ++没有针对每种类型的基类,您需要使用构造函数模板在编译时为每种类型的实例化实例化构造函数。

如果您确实希望将参数存储在Test内(数组类型的模板特化,便捷函数模板make_test等),这会变得更复杂。我想这是你的模板入口,所以你可能想要一步一步去。

答案 1 :(得分:1)

在您的示例中,您不需要赋值运算符,但converting constructor将接受各种类型:

class Test{
public:    
    Test(){}

    Test(int r){}
    Test(const char* r){}
    Test(bool r){}
    Test(const Test& r){}
};
int main(){
    Test a = 5;
    Test b = "A";
    Test c = true;
    Test d = Test();
}

但是实现赋值运算符也是有意义的。如果你真的需要任何类型然后使用模板,你的构造函数将如下所示:

    template<typename T>
    Test(const T& t){}