我有一个需要值,符号和宽度的类的构造函数。这是一个示例构造函数:
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&)'