c++ - 声明模板时是否需要typename/class

标签 c++ template-meta-programming

当声明模板参数时 typename/class 是必需的(因为在语言中不能使用 diff 语法,我在下面建议)。我知道模板参数可以是整数,所以你必须选择默认为 int 或 typename/class 但仍然。

即为什么不

template <T>
T max(T a, T b) {
    return a > b ? a : b;
}

代替

template <typename T>
T max(T a, T b) {
    return a > b ? a : b;
}

template<T, size_t n>
size_t array_size(const T (&)[n]) {
    return n;
}

代替

template<typename T, size_t n>
size_t array_size(const T (&)[n]) {
    return n;
}

最佳答案

如果模板参数默认为类型,该语言当然仍然可以工作;就像 C 过去在没有类型说明符的情况下变量类型默认为 int 时一样。会有一些歧义需要克服,例如:

typedef int T;
template <T> class C;  // type, or non-type value of type `T`?

但是,强制您明确说明可以更好地进行诊断。如果我忘记指定非类型参数的类型,那么编译器可以立即发现错误并告诉我。在你的世界里,它会假设我想要一个类型参数,并继续尝试相应地解释模板;可能会产生令人困惑的错误,或者甚至可能成功地编译了一些完全错误的东西。

我无法评论这是否是这里不允许默认值的原因(或者从 C 中删除默认变量类型,或者从不允许在 C++ 中使用它们),但这对我来说肯定是一个足够好的理由。

关于c++ - 声明模板时是否需要typename/class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14589803/

相关文章:

c++ - 参数化运算符重载

c++ - 将 BigInteger 分配给普通整数

c++ - 在元组中搜索函数的参数

c++ - 使用模式初始化 `constexpr` 数组

c++ - 运行时非多态容器

c++ - 生成模板实例列表并在其上调用静态函数

c++:访问父类的成员

c++ - 大括号初始值设定项列表作为函数参数

c++ - 为什么 shared_ptr 不允许直接分配

c++ - 应用程序启动时停靠 QDockWidget?