2011-12-11 52 views
0

假设我有一个类,如下面定义的Value一个接口可以只指定方法名称,但不能返回类型?

template <typename T> 
class Value : public ValueInterface 
{ 
    public: 
     // ... 
     T getValue() const; 

    private: 
     T value_; 
} 

我可以在我的代码是指多个Value期不同类型(即不同类型的T)的一般(创建一个容器,例如)?我首先想到的是,如果有可能以某种方式声明一个纯抽象类从Value可以继承:

class ValueInterface 
{ 
    public: 
     ?? getValue() const = 0; 
} 

template <typename T> 
class Value : public ValueInterface 
{ 
    // ... 
} 

std::list<ValueInterface> lst; 
Value<int> i(...); 
Value<char> c(...); 

lst.push_back(i); 
lst.push_back(c); 

int vi = i.getValue(); 
char vc = c.getValue(); 

如果是不可能的,你能提供一个替代的解决方案?

+2

你可以给一个伪代码如何使用这样的功能的例子吗? –

+0

它就在那里,在第二个片段。我需要声明一个'std :: list'来存放不同的'Value'。 –

+0

但是,这与你的'getValue'方法有什么关系? –

回答

1

在C++中,所有表达式都必须具有编译器已知的类型,但在您的解决方案lst.begin()->getValue()中不会有任何特定的类型。

虽然如果你仔细看看你的例子,你不会在任何地方调用ValueInterface::getValue(),只是子类的版本。

你可以尝试以下方法:

class ValueInterface 
{ 
    public: 
    template <typename T> 
    T getValue() const 
    { 
     return dynamic_cast< const Value<T> &>(*this).getValue(); 
    } 
    virtual ~ValueInterface() 
    { } 
}; 

template <typename T> 
class Value : public ValueInterface 
{ 
    public: 
     // ... 
     T getValue() const; 

    private: 
     T value_; 
}; 

注意getValue()不是(也不可能是)虚。

现在你可以从你的例子写的代码,也:

int z = lst.begin()->getValue<int>(); 

如果您在getValue调用,那么一个异常std::bad_cast将被抛出使用错误的类型。

+2

您需要至少一个用于'dynamic_cast'的虚函数才能工作。 – Xeo

+0

@Xeo好点。析构函数是这里最好的选择。更新。 – rodrigo

0

您不能在返回类型上重载,因为这会造成各种不明确之处。

我不太清楚你想在这里做什么。我假设你将遍历blah或从中选取一个随机元素,然后在所述元素上调用getValue()。此通话可能会返回任何类型:charconst void*Value< Value< Value<const void*> > >等。您将如何处理结果?你甚至会为它定义一个变量?

+0

使用blah的函数将知道哪些元素返回什么类型,并相应地声明变量。 –

+0

@Dan:如果你有编译时知道你正在使用的变量的类型,你首先不需要多态。 – suszterpatt

相关问题