c++ - 具有非类型模板参数的构造函数

标签 c++ templates language-lawyer c++17

this question据说不可能直接为类构造函数使用模板参数,因为如果你写类似的东西

struct S{
    template<typename T>
    S() { ... }
}

那么你就没有办法调用这个构造函数了。但是,有一些解决方法可以使这项工作起作用,例如,通过模板参数推导。

但我所知道的所有这些解决方法都仅适用于类型参数。所以,问题是

是否有任何变通方法可以使此方法适用于非类型模板参数?

struct S{
    template<int x>
    S() { ... }
}

我对应该在现代 C++(C++17 标准,包括所有 TS)中工作的解决方案很感兴趣,因为这是一个理论问题而不是实际问题。

最佳答案

But all of these workarounds I know are for type arguments only

所有解决方法都不是特定于类型的——重点是在构造函数中添加一些可以推导出来的东西。所以如果我们想要一个类型,我们会做类似的事情:

template <class T> struct tag { };

struct S {
    template <class T>
    S(tag<T>);
};

如果我们想要一个int,我们做同样的事情:

template <int I> struct val { };

struct S {
    template <int I>
    S(val<I>);
};

对于值,您甚至不需要想出自己的标记类型 - 您可以在 std::integral_constant 之上进行 piggy-pack。

关于c++ - 具有非类型模板参数的构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43211721/

相关文章:

c++ - 模板类中的模板函数

java - 允许整数数字之间使用下划线的理由是什么?

c++ - 点结构声明

c++ - 编译时构造函数选择

c++ - 如何允许线程 2 在我在线程 1 中打开的端口上进行通信?

c++ - 语言的哪一部分禁止更改 std::set 的元素

c++ - 迭代器和标量对象之间的未定义行为有什么区别吗?

c++ - C++ 中的命名常量

c++ - 当存在用户定义的移动分配运算符时,模板化的移动分配运算符被删除

c++ - 非类型模板参数和 std::enable_if_t