带模板参数的函数调用

Dir*_*irk 6 c++ constructor overloading type-conversion

我写了一个简单的类模板:

template <class T>
class my_class
{
public:
    my_class(T value)
        : my_Value(value)
    {
    }
private:
    T my_Value;
};
Run Code Online (Sandbox Code Playgroud)

现在我可以在一个简单的函数签名中使用这个模板,比如: my_function(my_class<std::string> my_string)

当我想调用该函数时,我可以轻松使用它:

auto my_instance = my_class<std::string>("my value");
my_function(my_instance);
Run Code Online (Sandbox Code Playgroud)

但我想实现的是这样的函数调用:

my_function("my value")
Run Code Online (Sandbox Code Playgroud)

我的类模板应该为我隐式地转换为模板的类型。我想我需要某种运算符重载。

std:optional 例如可以这样做。

Jar*_*d42 4

您只能进行一次隐式用户转换,因此您的调用const char*无效。

有几种选择,

  • 为 my_class 添加另一个构造函数

    my_class(T value) : my_Value(value) {}
    
    template <typename U, std::enable_if_t<std::is_convertible<U, T>, int> = 0>
    my_class(U value) : my_Value(value) {}
    
    Run Code Online (Sandbox Code Playgroud)
  • 为 my_function 添加重载,

    void my_function(my_class<std::string> my_string)
    void my_function(const char* s) { return my_function(my_class<std::string>{s}); }
    
    Run Code Online (Sandbox Code Playgroud)
  • 更改调用站点以使用以下方式调用它std::string

    my_function(std::string("my value"))
    
    using namespace std::string_literals;
    my_function("my value"s)
    
    Run Code Online (Sandbox Code Playgroud)