任何指针类型的模板特化

丹尼斯·谢勒梅

我有以下课程

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

模板中模板类型相关结构的特化

来自分类Dev

表达式模板的模板化返回类型特化

来自分类Dev

别名模板中的模板参数推导-类型化任何成员函数指针

来自分类Dev

允许函数指针类型的模板参数接受任何返回类型的函数

来自分类Dev

返回类型的C ++ 11方法模板特化

来自分类Dev

为什么模板特化不能更改返回类型?

来自分类Dev

检查模板中nullptr的函数指针是否有任何可调用的类型

来自分类Dev

类模板方法的特化,类型名是类模板 - 错误:参数的类型/值不匹配

来自分类Dev

指向模板参数类型的指针

来自分类Dev

模板类型未使用指针类型推导

来自分类Dev

模板类型未使用指针类型推导

来自分类Dev

部分模板特化错误

来自分类Dev

C ++函数模板特化声明和模板参数;无vs。<> vs. <类型>

来自分类Dev

内部模板类型std :: vector <std :: vector <T >>的功能模板重载或特化

来自分类Dev

C++ 模板特化 - 将其他整数类型委托给 uint64_t

来自分类Dev

指针非类型模板参数

来自分类Dev

函数指针类型的c ++模板调用

来自分类Dev

如何禁用指针作为模板类型名

来自分类Dev

功能指针类型的c ++模板调用

来自分类Dev

传递指针类型作为模板参数

来自分类Dev

仅接受指针类型参数的模板

来自分类Dev

模板参数的模板化模板特化

来自分类Dev

模板特化中的 std::array

来自分类Dev

在模板特化中使用 typedef

来自分类Dev

类中可能的模板特化

来自分类Dev

类模板成员函数的特化

来自分类Dev

任何类型的指针都可以指向任何东西?

来自分类Dev

值列表(任何类型)作为模板参数

来自分类Dev

void 或任何类型作为模板参数

Related 相关文章

热门标签

归档