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

标签 c++ templates

我有以下类(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/

相关文章:

c++ - 学习类 C++ - 无法在嵌套在另一个类中的类数组中设置值。

c++ - 如何在c++中的文件处理中删除文件

C++ 模板不接受迭代器

C++ 模板正式排序规则

c++ - 模板函数 - 类型检查错误 - C++

c++ - OpenCV CLion (Cmake) 链接问题 - cmake 报告一个奇怪的错误

c++ - 在 C++ 中处理字符串时如何使用 memset?

c++ - vector : namespace std 的重载运算符 +

c++ - 为派生类特化类模板方法

c++ - 基于模板变量参数的类模板内的函数指针定义