【发布时间】:2020-08-27 10:31:41
【问题描述】:
我想存储一对成员 get/set 函数以供以后与 T 类型的对象一起使用。
我有一个部分工作的设置,见下文。然而问题仍然存在:
-
我如何(巧妙地)处理所有可能的变体? member_get 可能是 [返回值或 const value& 甚至 value& | const or non-const] member_set 可以是 [接受 const &, & 或 &&]。当然,“最佳实践”会排除某些组合,但我不能依赖它,因为 member_get 和 member_set 的定义不在我的掌控之中。
-
如何正确处理可能的 member_set 移动语义?
-
是否有不同/更好/更简单的通用方法来解决这个问题?
注意事项:
- 我故意让设置器的确切类型 S 保持打开状态。不确定这是个好主意还是坏主意。
- 显然我想到了 Lambda,但我看不出它们如何解决这个问题。
Make( get, set )的调用者不应该提供 lambda。那就是把问题委托给他!? - 任何 std::function 想法都应该因为开销而被排除
template <typename T, typename V, typename G, typename S>
class GetSet
{
public:
constexpr GetSet( G member_get, S member_set ) : Get( member_get ), Set( member_set )
{ }
auto GetValue( const T& t ) const
{
return ( t.*Get )( );
}
void SetValue( T& t, V&& value ) const
{
( t.*Set )( std::forward<V>( value ) );
}
private:
G Get;
S Set;
};
template <typename T, typename ValueType, typename S>
constexpr auto Make( ValueType( T::*member_get )( ) const, S member_set )
{
using G = ValueType( T::* )( ) const;
return GetSet<T, ValueType, G, S>( member_get, member_set );
}
【问题讨论】:
标签: c++ templates member-function-pointers member-functions