限制C++;相同值类型容器的模板参数 我有一个C++模板函数: template<typename Input, typename Output> void Process(const Input &in, Output *out) { ... } 模板 无效流程(常量输入和输入,输出*输出){ ... }

限制C++;相同值类型容器的模板参数 我有一个C++模板函数: template<typename Input, typename Output> void Process(const Input &in, Output *out) { ... } 模板 无效流程(常量输入和输入,输出*输出){ ... },c++,templates,containers,C++,Templates,Containers,如果使用不同类型的容器调用它,如何使用友好的错误消息使其成为编译错误?例如,调用set sout;进程(向量(),&sout)应该可以工作,但是矢量vout;进程(向量(),&vout)应该是编译错误 如果使用不可相互转换的容器调用,如何使其成为带有友好错误消息的编译错误?例如,上面的调用应该可以工作,但是struct A{};结构B{};矢量输出;进程(向量(),&vbout)应该是编译错误` 您只需static\u assert()确定两种类型的value\u types是相同的: stat

如果使用不同类型的容器调用它,如何使用友好的错误消息使其成为编译错误?例如,调用
set sout;进程(向量(),&sout)应该可以工作,但是
矢量vout;进程(向量(),&vout)应该是编译错误

  • 如果使用不可相互转换的容器调用,如何使其成为带有友好错误消息的编译错误?例如,上面的调用应该可以工作,但是
    struct A{};结构B{};矢量输出;进程(向量(),&vbout)应该是编译错误`


  • 您只需
    static\u assert()
    确定两种类型的
    value\u type
    s是相同的:

    static_assert(std::is_same<typename Input::value_type, typename Output::value_type>::value,
                  "the containers passed to Process() need to have the same value_type");
    

    您只需
    static\u assert()
    确定两种类型的
    value\u type
    s是相同的:

    static_assert(std::is_same<typename Input::value_type, typename Output::value_type>::value,
                  "the containers passed to Process() need to have the same value_type");
    


    1.您可以将static_assert与is_same一起使用。2)static_assert与is_可转换。但是还有很多其他的方法,让你的输入和输出参数都是相同的类型,编译器会帮你做到这一点。不过这些消息可能不是最友好的。@TimDave:编译器会怎么做1。为了我?我明确要求提供友好的错误消息。我怎么知道?除了Dietmar Kühl的答案之外,你还有什么其他建议吗?使用模板元编程可以获得更好的错误消息,但技术可能非常复杂。提供的解决方案将起作用。正如我所指出的,输出可能不友好:)1。您可以将static_assert与is_same一起使用。2)static_assert与is_可转换。但是还有很多其他的方法,让你的输入和输出参数都是相同的类型,编译器会帮你做到这一点。不过这些消息可能不是最友好的。@TimDave:编译器会怎么做1。为了我?我明确要求提供友好的错误消息。我怎么知道?除了Dietmar Kühl的答案之外,你还有什么其他建议吗?使用模板元编程可以获得更好的错误消息,但技术可能非常复杂。提供的解决方案将起作用。正如我所指出的,输出可能不友好:)次要挑剔:第二个
    static_assert
    的错误消息与检查不匹配。此外,传递给Process()位也可以省略。
    static\u assert
    将指向正确的位置。@IInspectable:呃,是-不是容器需要可转换,而是值。我更新了消息!谢谢。是否可以删除函数体中的所有其他警告和错误?有没有一个解决方案可以与
    g++-std=c++98
    一起使用?这可能是静态断言的一个很好的用法。另一种方法是使用
    enable_if
    在没有意义的情况下甚至不提供重载,但错误会明显不友好,这并不是过载扩散的问题。小细节:第二个
    static_assert
    的错误消息与检查不匹配。此外,传递给Process()位也可以省略。
    static\u assert
    将指向正确的位置。@IInspectable:呃,是-不是容器需要可转换,而是值。我更新了消息!谢谢。是否可以删除函数体中的所有其他警告和错误?有没有一个解决方案可以与
    g++-std=c++98
    一起使用?这可能是静态断言的一个很好的用法。另一种方法是使用
    enable_if
    在没有意义的情况下甚至不提供重载,但错误会明显不那么友好,而这并不是过载扩散的真正问题。