gpt4 book ai didi

c++ - C++17中类模板的模板参数推导 : am I doing it wrong?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:17:31 31 4
gpt4 key购买 nike

根据 https://gcc.gnu.org/projects/cxx-status.html ,g++ 版本 7,与标志一起使用 -std=c++1z , 支持类模板的模板参数推导。

我希望下面的代码能够编译,尤其是 Base是一个抽象类,因此:
1. 编译器不知道 Base 的实例可以创建;
2.指向基址的指针pt_base指向明确定义的实例(即 Derived<int>{42} ),其中类型 ( int ) 是显式的。

template<typename ValueType>
class Base {
public:
virtual ValueType getValue() = 0;
};

template<typename ValueType>
class Derived : public Base<ValueType>{
public:
Derived(ValueType argt){ value = argt; }
virtual ValueType getValue(){ return value; }
ValueType value;
};

int main(){
Base *pt_base = new(Derived<int>{42}); // *ERROR*
delete pt_base;
}

然而,它does not compile . G++ 提示“模板占位符类型‘Base’必须后跟一个简单的声明符 id”;如果我理解正确的话,它不会推导出模板参数。
很遗憾,因为我想动态决定哪个派生类pt_base指向(可以是类 Derived<someType> 或类 Derived2<someType2> 的对象)。这样,数组或 vector<Base *>可以存储指向各种派生类对象的指针。

GCC 只有 experimental support对于 C++17,我无权访问其他编译器,因此尽管出现编译错误,但我不确定我的代码是否有误。你怎么看?
我们如何动态决定 pt_base指向 Derived<someType> 中的一个对象或 Derived2<someType2> (所以可以使用多态性)?

最佳答案

类模板参数推导适用于声明类类型的实例:

Derived d(42);

或新表达式:

auto p = new Derived(42);

或函数式转换:

foo(Derived(42));

它不适用于声明指针。


您只需像往常一样简单地提供模板参数。或者,我猜:

template <class T> Base<T>* downcast(Base<T>* p) { return p; }
auto pt_base = downcast(new Derived(42));

关于c++ - C++17中类模板的模板参数推导 : am I doing it wrong?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46085683/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com