是否可以对零模板参数进行模板专门化
Is it possible to make template specialization for zero template arguments?
假设我有一个这样的类:
template <typename T>
struct S {
int n = 1;
S(T t) : n(t) {};
S() = default;
};
如果我想使用像S s {};
这样的默认构造函数,是否可以更改某些内容,以便在没有模板参数的情况下实例化S
?
我想出的最好的办法是给模板参数分配一些伪造的默认值,这样它就变成了可选的:
#include <iostream>
struct default_ {};
template <typename T = default_>
struct S {
int n = 1;
S(T t) : n(t) {};
S() = default;
};
int main() {
S<int> s1 {10};
std::cout << "Value:n" << s1.n << std::endl;
S s2 {};
std::cout << "Value:n" << s2.n << std::endl;
}
https://repl.it/repls/RegalCoolDeal
如果T
仅用于构造函数,则不需要对整个类进行模板化:
#include <iostream>
struct S {
int n = 1;
template <typename T>
S(T t) : n(t) {};
S() = default;
};
int main() {
S s1 {10};
std::cout << "Value:n" << s1.n << std::endl;
S s2 {};
std::cout << "Value:n" << s2.n << std::endl;
}
您可以将S专门化为void并创建一个CTADhttps://en.cppreference.com/w/cpp/language/class_template_argument_deduction
#include <iostream>
template <typename T>
struct S {
int n = 1;
S(T t) : n(t) {}; // no default
};
template <>
struct S<void> {
int n = 1;
S() = default; // only default
};
// CTAD calls to constructor S() will instantiate as S<void>
template<typename... T> S() -> S<void>;
int main() {
S<int> s1 {10};
std::cout << "Value:n" << s1.n << std::endl;
S s2 {}; // here CTAD will be trigged
std::cout << "Value:n" << s2.n << std::endl;
}
指向cppignotics的链接可能有助于了解实例化的内容和位置:https://cppinsights.io/s/8f0f4bf6
相关文章:
- 是否可以对零模板参数进行模板专门化
- 我能否根据其运算符()的签名专门化可变参数模板参数
- 取消专门化C++模板参数
- 模板函数,其中一个参数需要专门化,而另一个不需要
- 如何为特定数量的模板参数专门化可变参数模板结构
- 使用非类型模板参数进行专门化模板模板参数
- g++和clang++在结构/类专门化中具有非类型参数的不同行为
- 我如何避免使用依赖于参数的查找明确专门化模板化功能
- 专门化采用通用引用参数的函数模板
- 如果需要参数包,则使用SFINAE专门化类
- c++多参数模板化的类成员专门化
- C++11`using`关键字:专门化模板参数的模板别名
- 如何在没有参数的情况下专门化模板类
- 我可以用非模板类专门化一个可变模板模板模板参数吗
- 如何在C++中专门化 std::vector 的模板模板参数
- 按参数C++类型专门化重载构造函数
- 将“类型参数”与“非类型参数”(或相反)专门化
- 如何在非模板化类中专门化没有参数的模板化方法
- 在 C++ 中鸭子键入(通过其非类型模板参数的值专门化模板函数)
- 使用已推导的模板参数专门化模板成员函数