c++ - 可变参数模板函数的特化

标签 c++ templates c++11 variadic-templates

我正在尝试为我定义的任意数量的特定类型层次结构聚合成员变量的值。

使用可变参数模板函数,这很容易做到。

当我尝试将调用此模板的函数名称作为字符串作为第一个参数传递时,我运气不太好。 这很难解释,所以下面是一些我必须演示我正在尝试做的事情的代码。

尝试编译此结果: 错误 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;
}

最佳答案

改变

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

到:

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

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

请注意,函数模板不能部分特化。通过此替换,您将拥有两个 set_results重载。将选择带有 std::string 参数的那个,因为它更专业。

关于c++ - 可变参数模板函数的特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24815337/

相关文章:

c++ - 在这种情况下如何从类型 "const char*"初始化字段?

c++ - 嵌套类的部分特化

c++ - 使用 ASIO 将带有超时的连接尝试作为组合操作

c++ - 为什么这里打印的 vector 内容是错误的?

c++ - 命令模式 : Where to create the Command items?

html - 去html模板表

c++ - 使用模板模板参数时出错

c++ - 如何让转发函数调用在转发函数之后声明的基本模板函数

c++ - 如何将 type 和 mpl::vector 连接到一个新的 vector 中

c++ - Boost.Python 和 std::shared_ptr 的多态行为