我有以下课程
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...
可隐式转换为预期的构造函数args但有不同的类型时,我遇到了问题。像这样:
auto a = std::make_shared<HasId>("foobar");
MyClass b(a, 42.0);
在这种情况下,编译器会尝试将string
和double
替换为模板化的ctor,但显然会失败。我知道我可以修改私有ctors并在templated ctor中初始化id
字段,但我想知道是否可以仅为指针类型指定单个模板(std::shared_ptr<T>
,T*
,等)。
答案 0 :(得分:2)
如果def assign_attributes(new_attributes)
if !new_attributes.respond_to?(:stringify_keys)
raise ArgumentError, "When assigning attributes, you must pass a hash as an argument."
end
return if new_attributes.empty?
attributes = new_attributes.stringify_keys
_assign_attributes(sanitize_for_mass_assignment(attributes))
end
有效,您需要模板构造函数才能参与重载解析。这可以通过添加(虚拟)模板参数
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)...)
{}