Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 接口能否只指定方法名,而不指定返回类型?_C++_Templates_Interface_Polymorphism - Fatal编程技术网

C++ 接口能否只指定方法名,而不指定返回类型?

C++ 接口能否只指定方法名,而不指定返回类型?,c++,templates,interface,polymorphism,C++,Templates,Interface,Polymorphism,假设我在下面定义了一个类,如Value template <typename T> class Value : public ValueInterface { public: // ... T getValue() const; private: T value_; } 如果不可能,您能否提供替代解决方案 不能重载返回类型,因为那样会产生各种歧义 我不太清楚你想在这里做什么。我假设您将迭代blah或从中选择一个随机元

假设我在下面定义了一个类,如
Value

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

    private:
        T value_;
}

如果不可能,您能否提供替代解决方案

不能重载返回类型,因为那样会产生各种歧义


我不太清楚你想在这里做什么。我假设您将迭代
blah
或从中选择一个随机元素,然后对所述元素调用
getValue()
。此调用可以返回任何类型:
char
const void*
Value
,等等。您将如何处理结果?在C++中,所有表达式都必须有编译器所知道的类型,但是在你的解决方案<代码> LST。 尽管如果仔细查看示例,您不会在任何地方调用
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
调用中使用了错误的类型,则会引发异常
std::bad_cast

能否给出一个伪代码示例,说明如何使用此功能?它就在第二个代码段中。我需要声明一个
std::list
来保存不同的
s。但是这与您的
getValue
方法有什么关系呢?在您的示例中,您没有以多态方式使用
getValue
方法,所以我不确定您为什么要声明它
virtual
。我也不明白这与容器有什么关系。您可能会发现
boost::any
库很有用。使用blah的函数会知道哪些元素返回什么类型,并相应地声明变量。@Dan:如果您对所使用的变量类型有编译时知识,首先,您不需要多态性。您需要至少一个虚拟函数才能使
动态\u cast
工作。@Xeo这一点很好。析构函数是这里最好的选择。更新。
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_;
};
int z = lst.begin()->getValue<int>();