我有以下类(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);
在这种情况下,编译器会尝试替换 string
和 double
进入模板化的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)...)
{}
但是在你的情况下,它会更容易
template<typename T>
MyClass (const T& t, int count) :
MyClass(t->getId(), count)
{}
关于c++ - 任何指针类型的模板特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50017345/