#include <string>
#include <cstdio>

void set(const char *s1, const char *s2, const char *s3)
{
    /// Common implementation
    std::printf("s1: %s, s2: %s, s3: %s\n", s1, s2, s3);
}

const char *conv(const char *s)
{
    return s;
}
const char *conv(const std::string &s)
{
    return s.c_str();
}

template<typename T1, typename T2, typename T3>
void set(const T1 &s1, const T2 &s2, const T3 &s3)
{
    set(conv(s1), conv(s2), conv(s3));
}

int main()
{
    std::string s1 = "sss111";
    std::string s2 = "TWO";
    const char * s3 = "III help";

    set(s1, s2, s3);
    set("Hello!", s3, s1);
    return 0;
}
