現在、複雑な構造の内部要素にconstまたは非const参照としてアクセスできるようにするインターフェイスクラスを作成しています。いくつかのモジュールにはconstアクセスが与えられ、いくつかのモジュールにはフルアクセスが許可されるという考え方です。メンバ関数にconst修飾子を追加する
私は 'type_traits' std :: add_constを使用して内部メンバー関数の戻り値の型を条件付きで修飾しましたが、残念ながらconstまたはnon-constとしてメンバー関数を条件付きで修飾する方法は考えられません。
これも可能ですか?もしそうなら、どのように?
例えば:
template< typename T, bool isConst >
struct apply_const
{
typedef T type;
};
template<typename T>
struct apply_const<T, true>
{
typedef typename std::add_const<T>::type type;
};
template< bool isConst >
const Interface
{
/// @brief get the TypeA member
typename apply_const<TypeA, isConst >::type& GetXpo3Container() // how do I conditionally add a const qualifier
{
return config_.type_a_member_;
}
typename apply_const<Profile, isConst >::type& GetProfile(unint32_t id) // qualifier ???
{
return config_.profiles.get(id);
}
// .... lots more access functions
ConfigType config_; // the config
};
注: - 書き込み可能としないものである一つのインタフェースの2つのバージョンを作成する/分離するための根本的な理由は、それらがconfig
の異なるインスタンスへのアクセスを提供することです。開発中のサブシステムは、<running>
と<candidate>
構成をサポートする組み込みNetconfエージェントです。
2つのオーバーロード(1つのconstと1つの非const)を使用し、SFINAEを使用して一度に1つのみを有効にします。 – ildjarn
2つのオーバーロードでは、実際には何も保存されません(下記参照)。目的は2つのバージョンの 'インターフェース'を提供することです。ここではすべてのメンバー関数は 'const'参照を返し、もう1つはすべてのメンバー関数が非const参照を返します。戻り値の型は、メンバ関数の資格だけで問題にはなりません。私はメンバー機能についての資格がなくて済むようにしなければならないと思う。それはあまり問題ではない。 – mark