我想定义一个类模板,该类模板接受对正在定义的类的实例进行操作的函数模板参数。
这或类似的可能吗?
我知道我可以定义转换构造函数,但是由于从这个简化示例中不清楚的原因,我希望能够在不更改类定义或创建派生类型的情况下更改类的功能。
我知道我可以包括函数指针成员并使用setter来修复其功能,但是我更喜欢使用声明性typedef而不是通过编程来修复类的功能。
template
< typename T
, MyClass<X> (to_X)(MyClass<T>)
, MyClass<T> (from_X)(MyClass<X>)
>
class MyClass {
T value;
MyClass(T v) : value(v) {}
// is it possible to use to_X and from_X template args
// to declare member functions ...
}
MyClass<int> to_int(MyClass<std::string> value ) {
// return result of conversion
}
MyClass<std::string> to_string(MyClass<int> value ) {
// return result of conversion
}
MyClass<std::string, to_string, to_int> foo1 =
MyClass<std::string, to_string, to_int>("5");
MyClass<int, to_int, to_string> * foo2 = foo1.to_int();
我建议您使用策略类方法:将您的类模板参数化为两个转换策略
template<typename T,
typename FROM,
typename TO
>
class MyClass
{
FROM from_t_conversion;
TO to_t_conversion;
MyClass() = default;
template<typename U>
operator U() const
{
return from_t_conversion( *this );
}
template<typename U>
MyClass( const U& u ) : MyClass()
{
std::swap( *this , to_t_conversion( u ) );
}
};
该设计的重点是转换策略的类型(形式):转换策略可以是具有预期签名的任何可调用实体:函数,函子,lambda等。
编辑:这是转换器的示例:
struct float_to_int
{
MyClass<itn> operator()( const MyClass<float>& )
{
return MyClass<int>{};
}
};
//A more generic conversion function:
template<typename T>
struct generic_to_converter
{
template<typename U , typename X = T>
MyClass<X> operator()( const MyCLass<U>& )
{
return /* something /*
}
};
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句