构造函数中指定的模板参数

Specified template parameter on a constructor

本文关键字:参数 构造函数      更新时间:2023-10-16

下面是我的代码:

class test{
    public:
    template<int B>
    test(const char(&a)[B]){
        std::cout<<B<<std::endl;
    }
};
int main(int argc, char** argv) {

    test t("test");
    return 0;
}
输出:

5

我正在做一些研究,发现了这段代码。它将计算字符的数量(确切地说是-1)。我想知道一个特定的int B的用途。在模板参数中,如果我输入如下内容

class test{
public:
template<char B> 
test(){
}
};
int main(int argc, char** argv) {

    test t(); //error, how to make it work?
    return 0;
}

我的问题是:

从我的第一个例子,它是如何准确地计算字符的数量的?在模板构造函数中指定类型的目的是什么,就像我的例子2一样,如果我有一个char类型,我如何使它工作?(我得到一个错误,当我试图编译)

在您的第一个示例中,"test"可以被认为是const char s[5] = "test"。从这里可以将模板构造为const char(&a)[5],但由于在模板定义中使用了B,因此"5"被抓取为B的值。

你的第二个例子/问题不清楚

c++中的字符串字面值具有常量字符数组类型。因此字符串字面值"test"具有类型const char[5](字符串字面值包括结束的零)。因此,在第一个程序中,编译器可以确定模板实参,因为数组(字符串字面量)是通过引用传递的。

在第二个程序中声明

test t(); 

是一个返回类型为test且没有形参的函数的声明。

如果你想在第二个程序中声明一个test类的对象,你可以这样编写程序

class test{
public:
template<char B = 'A'> 
test(){
}
};
int main(int argc, char** argv) {

    test t;
    return 0;
}