我想创建一个可变的完美转发make_shared<T>
包装器,但是关于T
的构造函数是否接受任何非const引用/指针参数的SFINAEd。我们的想法是拥有两个名为construct
和construct_nonconst
的包装器,在构建Foo(int& r)
或Foo(int* r)
时,必须使用后者。这样做的目的是当开发人员编写构造函数需要非const参数的类时,他们可以这样做,但它在调用站点清楚地显示构造可能具有局部副作用。
我查看了Implementing variadic type traits,并使用了is_constructible
(我试图将我的Args ...参数包转换为其中的所有const
版本),但我不能似乎很清楚。
期望的结果:
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