【问题标题】:How to define conversion to class template working when used as function argument用作函数参数时如何定义转换为类模板工作
【发布时间】:2020-05-17 20:33:55
【问题描述】:

拥有这个模板:

template <bool X> 
struct Foo {
  Foo(int v) : v(v) {}
  int v;
};

我可以说,默认情况下Foo应该是False,带有推导指南:

Foo(int)->Foo<false>;

感谢这段代码的工作:

Foo a = 5;

我的问题是,当Foo 用作函数参数时,我怎样才能使它工作:

template <bool X> 
void f(Foo<X> foo) { 
  cout << "Foo<" << X << ">(" << foo.v << ")" << endl; 
}
f(5); // error: no matching function for call to 'f'
      // candidate template ignored: could not match 'Foo<X>' against 'int'

我试着以某种方式说 f X 默认为 falsef(我的意思是编译器)不听我的:

template <bool X = false> // = false changes nothing, same error 
void f(Foo<X> foo) {
  cout << "Foo<" << X << ">(" << foo.v << ")" << endl; 
}
template <bool X> 
struct get_bool { // to force looking at f::X 
  static constexpr bool value = X; 
};

template <bool X = false> 
void f(Foo<get_bool<X>::value> foo) { 
  cout << "Foo<" << X << ">(" << foo.v << ")" << endl;         
  /* this is not working because 
   * get_bool evaulates before 
   * args matching and in the end, 
   * this function could be defined 
   * as: void f(Foo<false>) 
   */
}

我不介意引入一些额外的辅助类等。 我希望也许一些 decltypeautosome_trait&lt;&gt; 或其他辅助类 (/es) 魔法可以帮助解决这个问题,我想我也可以总结为: 如何定义函数的推导指南?

【问题讨论】:

    标签: c++ templates c++17 compile-time


    【解决方案1】:

    template &lt;bool X = false&gt; void f(Foo&lt;X&gt; foo) 的问题在于,在将实参传递给模板参数推导中使用的参数时,不允许进行隐式转换。

    您可以添加额外的f 重载以接受int,或者根本不将f 设为模板:

    struct Bar
    {
        bool x = false;
        int v = 0;
    
        template <bool X>
        Bar(Foo<X> foo) : x(X), v(foo) {}
    
        Bar(int v) : v(v) {}
    };
    
    void f(Bar bar) {...}
    

    这意味着布尔值不再是constexprf 内。如果你希望它是constexpr,你可以使用一个技巧:

    void f(Bar bar)
    {
        auto lambda = [&](auto x_value)
        {
            constexpr bool x = x_value;
            // Here `x` is `constexpr`.
        };
    
        if (bar.x)
            lambda(std::true_type{});
        else
            lambda(std::false_type{});
    }
    

    【讨论】:

    • 我希望有一些语法允许“在将参数传递给模板参数推导中使用的参数时”进行隐式转换。无论哪种方式,这都有很大帮助,谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多