gpt4 book ai didi

c++ - 任何指针类型的模板特化

转载 作者:行者123 更新时间:2023-11-30 03:24:04 26 4
gpt4 key购买 nike

我有以下类(class)

class MyClass {
std::string id;
int count;

MyClass (const std::string& id, const int count) :
id(id), count(count)
{}
public:
template<typename T, typename... Args>
MyClass (const T& t, Args&&... args) :
MyClass(t->getId(), std::forward<Args>(args)...)
{}
};

在我的真实案例中,它更复杂并且有不止一个私有(private)构造函数实现,所以模板实际上是有意义的。

我也很少上课 getId像这样的方法:

class HasId {
std::string id;

public:
HasId (const std::string& id) :
id(id)
{}

const std::string& getId () {
return id;
}
};

所以在我的代码中我可以这样做:

auto a = std::make_shared<HasId>("foobar");
MyClass b(a, 42);
HasId c("foobaz");
MyClass d(&c, 265);

但是当 Args... 时我遇到了问题可以隐式转换为预期的构造函数参数,但具有不同的类型。像这样:

auto a = std::make_shared<HasId>("foobar");
MyClass b(a, 42.0);

在这种情况下,编译器会尝试替换 stringdouble进入模板化的ctor,显然失败了。我知道我可以修改私有(private) ctors 并初始化 id模板构造函数中的字段,但我想知道是否可以仅为指针类型( std::shared_ptr<T>T* 等)指定单个模板。

最佳答案

如果 t->getId() 有效,您需要模板构造函数仅参与重载决议。这可以通过添加(虚拟)模板参数来完成

template<typename T, typename = decltype(std::declval<T&>()->getId()), typename... Args>
MyClass (const T& t, Args&&... args) :
MyClass(t->getId(), std::forward<Args>(args)...)
{}

See it live

但是在你的情况下,它会更容易

template<typename T>
MyClass (const T& t, int count) :
MyClass(t->getId(), count)
{}

关于c++ - 任何指针类型的模板特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50017345/

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