代码之家  ›  专栏  ›  技术社区  ›  Darius Duesentrieb

如何对多个模板参数使用用户定义的演绎指南?[副本]

  •  1
  • Darius Duesentrieb  · 技术社区  · 6 年前

    这个问题已经有了答案:

    我可以为具有多个模板参数的类使用用户定义的演绎指南吗?我希望从构造函数参数中推导出一个指定的模板参数。所有其他模板参数必须在 <> -构造类时使用括号。例子:

    #include <iostream>
    
    template<typename T, typename A>
    struct Hello
    {
        Hello(T x) : x(x) {}
        T x;
        A y;
    };
    
    Hello<A>(int) -> Hello<int, A>; // This is not a valid syntax but shows what i want to do 
    
    int main()
    {    
        Hello h = Hello<float>((int)1); // this should be deduced to Hello<int, float>
        std::cout << h.x << std::endl;
        return 0;
    }
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   Yuki    6 年前

    我可以考虑三种方法。

    template <typename T, typename A>
    struct Hello {
      Hello(T x) : x(x) {}
      T x;
      A y;
    };
    
    // Approach 1: use type aliases
    // Requires at least c++-11
    
    template <typename A>
    using HelloInt = Hello<int, A>;
    
    // Approach 2: use function factories
    
    template <typename A>
    Hello<int, A> make_hello_int(int i) {
        return Hello<int, A>(i);
    }
    
    // Approach 3: use template partial deduction
    
    template <typename A, typename T>
    Hello<T, A> make_hello(T i) {
      return Hello<T, A>(i);
    }
    
    int main() {
      // `auto` requires at least c++-11
      auto k = HelloInt<float>(1);
      std::cout << k.x << std::endl;
      std::cout << make_hello_int<float>(2).x << std::endl;
      std::cout << make_hello<float>(3).x << std::endl;
      return 0;
    }
    
        2
  •  -1
  •   TheTailgunner    6 年前

    在C++ 11中,模板参数不能由构造函数调用推断。在C++ 17中,它可以,但在您的情况下不是很有用,因为只允许完整的模板专精。