C++ 是否可以对零模板参数进行模板专门化?

C++ 是否可以对零模板参数进行模板专门化?,c++,c++17,C++,C++17,让我们假设我有一个这样的类: template <typename T> struct S { int n = 1; S(T t) : n(t) {}; S() = default; }; 如果T仅用于构造函数,则不需要为整个类设置模板: #include <iostream> struct S { int n = 1; template <typename T> S(T t) : n(t) {}; S() = defaul

让我们假设我有一个这样的类:

template <typename T>
struct S {
  int n = 1;
  S(T t) : n(t) {};
  S() = default;
};

如果
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;
}
#包括
结构{
int n=1;
模板
S(tt):n(T){};
S()=默认值;
};
int main(){
s1{10};

std::cout您可以将S专门化为void并创建CTAD

#包括
模板
结构{
int n=1;
S(tt):n(T){};//没有默认值
};
模板
结构{
int n=1;
S()=默认值;//仅默认值
};
//对构造函数S()的CTAD调用将实例化为S
模板S()->S;
int main(){
s1{10};

std::既然您声明默认,您可以使用默认构造函数了吗?您的问题需要澄清。您可以将模板参数默认为任意值。或者使用部分模板专用化。问题很明确,很有挑战性。请参见下面的我的答案;)为什么要用任意类型初始化整数
n
e?@jramsey,在这种情况下没关系。这不允许编译行
s1{10}
,这是原始问题和需求IMHO的一部分。@Hack06.我看不出问题中的任何地方有这个需求。@MadPhysicast,这取决于你,但我不会断章取义。我只是指出了其他人可能忽略的事实。谢谢!这对我来说似乎更好。请注意CTAD需要C++17编译。很好!非常感谢。
#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;
}
#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;
}