#include <iostream>
#include <string>
#include <iostream>
#include <string>
#include <memory>
template <typename MyType, typename StringT=std::string, typename... ArgsT,
typename = std::enable_if_t<std::is_constructible_v<std::string, StringT>>>
std::shared_ptr<MyType> my_function(const StringT& name, ArgsT&&... args) {
std::cout << "name: " << name << std::endl;
auto t = std::make_shared<MyType>(5);
return t;
}
template <typename MyType, typename Arg1, typename... ArgsT,
typename = std::enable_if_t<!std::is_constructible_v<std::string, Arg1>>>
std::shared_ptr<MyType> my_function(Arg1&& arg1, ArgsT&&... args) {
auto t = my_function<MyType>("default name", std::forward<Arg1>(arg1), std::forward<ArgsT>(args)...);
return t;
}
int main() {
std::string myvar= "something";
auto ret = my_function<int>("something");
auto ret2 = my_function<int, std::string>(myvar);
auto ret3 = my_function<int>(myvar);
auto ret4 = my_function<int>(42);// 42 could be anything
return 0;
}