用于基元的模板构造函数,避免歧义

时间:2013-11-22 23:42:48

标签: c++ templates constructor

我有一个需要值,符号和宽度的类的构造函数。这是一个示例构造函数:

Foo::Foo(char c) //let's just assume sizeof(char)=1
  : init(c, true, 8)
{}

但是我想对所有std::is_integral类型执行此操作,以便在重载像operator*()这样的函数时,编译器将隐式转换。例如,以下应该编译得很好:

Foo a = 1; //same as Foo a(1);
Foo b = a * 2;

我可以使构造函数成为这样的模板:

struct Foo{
    template<typename T>
    Foo(T t)
      : init(t, std::is_signed<T>::value, sizeof(T)*8)
    {}
};

但是我还想为std::string和其他东西添加一些额外的构造函数。有没有办法可以将模板用于基本类型,然后我的其他构造函数用于非基元(现在我得到模糊错误)?我有一种感觉,我需要为所有基元和<stdint> typedef手动创建构造函数...

我的第一次尝试如下,但这似乎没有效果

struct Foo{ 
  template<typename T, typename = typename std::enable_if<std::is_integral<T>::value,int>::type>
  Foo(const T& t)
    : init(t, std::is_signed<T>::value, sizeof(T)*8)
  {}
};

我的以下测试失败:

unsigned int uint;
Foo uintFoo(uint);
//undefined reference to 'Foo::Foo(unsigned int const&)'

0 个答案:

没有答案