I want to create a variadic perfect-forwarding make_shared<T> wrapper, but one which is SFINAEd on whether the constructor of T takes any non-const reference/pointer arguments. The idea is to have two wrappers, called construct and construct_nonconst, where when constructing a Foo(int& r) or Foo(int* r), one is obliged to use the latter. The purpose of this is so that when developers write classes whose constructors require non-const parameters, they can do so, but it clearly shows up at the call site that the construction may have local side-effects.
I looked at Implementing variadic type traits, and played with is_constructible (I was trying to convert my Args... parameter pack to all the const versions therein), but I can't quite seem to figure it out.
Desired outcome:
struct NonConst
{
NonConst(int& uhOh)
{
uhOh = 2;
}
};
struct Const
{
Const(const int& noProblemo)
{
// ...
}
};
struct ByValueStr
{
ByValueStr(std::string noProblemo)
{
// ...
}
};
int x = 5;
const int y = 5;
std::string s("foo")
auto nc1 = builder<NonConst>::construct(x); // this doesn't compile
auto nc2 = builder<NonConst>::construct_nonconst(x); // fine, but noticeable
auto c1 = builder<Const>::construct(x); // fine
auto c2 = builder<ByValueStr>::construct(s); // fine