是否可以在不扣除的情况下将模板参数转发到 make_*?



正如标题所说,我想这样做。 我有一个最小的课程:

class Foo
{
public:
/// I only need the type T, but no T instance
/// needed.
template <typename T>
Foo(const std::string&);
Foo(int);
private:
...
};

我需要从这个类创建一个共享指针。琐碎的 方法告诉我们这样做(例如,对于 T=int(:

std::shared_pointer foo_int = std::shared_pointer??("");

或直接:

auto foo_int = std::shared_pointer<Foo>??("");

但是,遵循最佳实践,应该使用make_shared(或make_unique 如果是std::unique_pointer(:

auto foo_int = std::make_shared<Foo>("");

那么,有可能做到吗?

/// I only need the type T, but no T instance
/// needed.
template <typename T>
Foo(const std::string&);

无法为构造函数显式指定模板参数。它们只能通过演绎或默认模板参数来确定。因此,此构造函数实际上永远无法使用。

一种可能的解决方法是改用标记参数和参数:

template <typename> struct type_tag {};
class Foo
{
public:
template <typename T>
Foo(type_tag<T>, const std::string&);
// ...
};

然后,您可以执行以下操作:

auto foo_int = std::make_shared<Foo>(type_tag<int>{}, "");

相关内容

  • 没有找到相关文章