可变参数模板功能的专业化

Jor*_*dan 3 c++ templates variadic-templates c++11

我正在尝试为我定义的某个特定类型的层次结构聚合成员变量的值.

使用可变模板函数这很好并且很容易.

我没有太多运气的地方是当我尝试将调用此模板的函数的名称作为字符串作为第一个参数传递时.这很难解释,所以下面是一些代码,我必须证明我正在尝试做什么.

尝试编译这会导致:错误C2993:'std :: string':非类型模板参数'str'的非法类型

我试图做的不可能吗?或者我只是以错误的方式解决这个问题?

std::ostringstream output;
int objCounter = 0;

void set_results() {
    output << "\n" << std::endl;
}

template <typename obj,  typename ...objs>
void set_results(obj objHead, objs... objTail) {
    ++objCounter;
    output << "Argument (" << objCounter << ") \t" << objHead.bytes << std::endl;
    set_results(objTail...);
}

template <std::string str, typename ...objs>
void set_results(std::string objHead, objs... objTail) {
    output << "Leaf Function: " << objHead << std::endl;
    set_results(objTail...);
}

class objDep {
public:
    int bytes;
    objDep(int b) : bytes(b) {}
};


int _tmain(int argc, _TCHAR* argv[])
{
    objDep one(1);
    objDep two(2);
    objDep three(3);
    objDep four(4);

    set_results(std::string("main"), one, two, three, four);

    std::cout << output.str() << std::endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Bri*_*ian 5

更改

template <std::string str, typename ...objs>
void set_results(std::string objHead, objs... objTail) {
    output << "Leaf Function: " << objHead << std::endl;
    set_results(objTail...);
}
Run Code Online (Sandbox Code Playgroud)

至:

template <typename ...objs>
void set_results(std::string objHead, objs... objTail) {
    output << "Leaf Function: " << objHead << std::endl;
    set_results(objTail...);
}
Run Code Online (Sandbox Code Playgroud)

您不能拥有类型的模板参数,std::string无论如何,完全不清楚您打算str代表什么.

请注意,功能模板不能部分专门化.以此替代,你将有两个重载set_results.std::string将选择带参数的那个,因为它更专业.


Jon*_*rdy 4

您根本不需要\xe2\x80\x99std::string str模板参数列表:

\n\n
template <typename ...objs>\nvoid set_results(std::string objHead, objs... objTail)\n
Run Code Online (Sandbox Code Playgroud)\n\n

首先,它\xe2\x80\x99s未使用,并且非类型模板参数只能是整数(intlong等)、枚举或函数符号。

\n\n

模板指定函数或类的通用方式。说:

\n\n
template <typename obj, typename ...objs>\nvoid set_results(obj objHead, objs... objTail)\n
Run Code Online (Sandbox Code Playgroud)\n\n

表示 \xe2\x80\x9c 给定某种类型(称为 )obj和一些类型列表(称为 ),objs分别set_results采用类型的值obj和一系列类型的值objs,并返回void\xe2\x80\x9d。

\n