SFINAE enable_if用于参考/指针常量上的可变参数完美转发模板

时间:2015-05-06 01:01:02

标签: c++ c++11 variadic-templates sfinae perfect-forwarding

我想创建一个可变的完美转发make_shared<T>包装器,但是关于T的构造函数是否接受任何非const引用/指针参数的SFINAEd。我们的想法是拥有两个名为constructconstruct_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

0 个答案:

没有答案