我有以下课程
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)...)
{}
};
在我的真实案例中,它更复杂,并且有不止一个私有构造函数实现,因此模板实际上是有意义的。
我也有几个类有这样的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);
在这种情况下,编译器尝试将string
和替换double
为模板化的 ctor 并且显然失败了。我知道我可以修改私人构建函数和初始化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)...)
{}
但是,在您的情况下,只是更容易
template<typename T>
MyClass (const T& t, int count) :
MyClass(t->getId(), count)
{}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句