2011-12-08 156 views
2

我有一个有几个构造函数的类。根据通过argv传递给main()的参数,我想在不同的构造函数之间切换。下面的简化例子在“obj”改为class并且我使用例如obj1-> int和obj2-> double。但是,我必须更改以下代码才能使用枚举运行?构造函数模板

#include<iostream> 

using namespace std; 

enum obj{obj1,obj2}; 

template <obj T> 
class A 
{ 
public: 
    A(T); 

private: 
    T t_; 
}; 

template<obj T> 
A<T>::A(T) 
{} 

template<> 
A<obj1>::A(obj1 t):t_(t) {cout<<"case 1"<< endl;} 

template<> 
A<obj2>::A(obj2 t):t_(t) {cout<<"case 2"<< endl;} 

int main() 
{ 
    obj test=obj1; 
    A<obj> a(test); 
    return 1; 
} 

谢谢你的帮忙!

编辑:很明显,代码是错误的类型/值,但哪种机制可以类似于这样的构造函数的切换?

+3

这没有任何意义。 'obj1'和'obj2'是enum * values *,但是您试图将它们用作* types *。 –

+1

' template '表示您需要提供**枚举值**。 'A '不会被编译,因为它不是一个值,它是一个类型。 –

回答

1

我认为下面是你打算做:

#include<iostream> 

enum obj{obj1,obj2}; 

template<obj> 
class A 
{ 
public: 
    A(); 

private: 
    obj t_; 
}; 

template<obj x> 
A<x>::A() : t_(x){} 

template<> 
A<obj1>::A() : t_(obj1){ std::cout << "obj1\n"; } 

template<> 
A<obj2>::A() : t_(obj2){ std::cout << "obj1\n"; } 

int main() 
{ 
    const obj x = obj1; // can only be used as the template argument below because it's a compile time constant 
    A<x> a; 

    return 0; 
} 

但是这只能如果你想在编译时间常数“开关”,它听起来就像你不知道。您需要使用运行时间条件(ifswitch等)。

+0

现在我看到了问题,我无法绕过const,非常感谢! –

3

你必须专注于类型,而不是价值观。如果您在编译时知道该值,则可以使用boost::mpl::int_这样做。如果你不这样做(就像你的情况),你将不得不忍受简单的旧的if

+0

关于boost :: mpl :: int_的提示非常有用,谢谢! –

0

你必须做这样的事情:

enum E 
{ 
    A, 
    B 
}; 

template<E e> 
struct A 
{ 
}; 

template<> 
struct A<E::A> 
{ 
}; 

template<> 
struct A<E::B> 
{ 
}; 

int main() 
{ 
    A<E::B> ab; 
} 
1

您正在接近问题的错误。模板在编译时被实例化,因此您不能根据运行时存在的值选择专门化。除了代码中的其他错误,此解决方案将无法工作。

这种问题的常见解决方案(基于参数创建不同的对象)是abstract factory pattern。这意味着您将条件构建逻辑移动到工厂类并使用虚拟方法来避免在调用方编写不同的代码(因此基本上可以利用多态性)。

+0

对上面的代码的修正将是以下代码。但是然后参数列表必须相等。 #include using namespace std; enum obj_type {obj1,obj2}; template struct obj { }; 模板 类A { 公共: A(INT,INT); private: int a_; \t int b_; \t obj_type type; }; 模板<> 甲> ::甲(INT A,INT B):A_(a)中,B_(B) { COUT << “壳体1” << ENDL; this-> type = obj1; } 模板<> 甲> ::甲(INT A,INT B):A_(一) { B_ = 0; cout <<“case 2”<< endl; this-> type = obj2; } INT主() { 甲>一(1,2); return 1; } –

+0

对不起,我不会破译。使用在线代码粘贴(pastebin.com)? –

+0

http://pastebin.com/n90uFDFn –