任何指针类型的模板特化

时间:2018-04-25 08:20:52

标签: c++ templates

我有以下课程

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);

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

1 个答案:

答案 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()

See it live

但是在你的情况下,只是

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