私は、特定のテンプレートタイプの引数を取る関数を持っています。簡易版は、次のようになります。非constテンプレートの引数型をconstに暗黙的に変換するための標準的な方法はありますか?
機能的#include <type_traits>
template <typename T>
struct foo
{
// default constructor
foo() { }
// simple copy constructor that can construct a foo<T> from a foo<T>
// or foo<const T>
foo(const foo<typename std::remove_const<T>::type> &) { }
};
、foo
はこの質問に関連していない他のいくつかのアドオン機能で、shared_ptr<T>
に似て動作します。関数のセマンティクスは、foo<const T>
を取り込むことを好むことを指示する。 foo<const T>
はfoo<T>
から暗黙的に構築可能であるので、私は、次のような何かをできるようにしたいと思います:
template <typename T>
void bar(foo<const T> f) { }
int main()
{
bar(foo<const int>()); // fine
bar(foo<int>()); // compile error
}
取るbar
に該当するオーバーロードが存在しないため、これが失敗したfoo<int>
(foo<const int>
は、暗黙のうちに可能性にもかかわらず、 foo<int>
から構築、テンプレートのインスタンスと協力してオーバーロードの解決はより厳しいように思われる。
これを達成するための標準的な方法はありますか?私はを取るbar()
ための2番目のオーバーロードを導入できることを知っています0と手動でbar(foo<const T>)
にディスパッチしますが、可能であれば重複を避けたいと思います。
作品罰金(BCC32) ideone.comではC++ 14を使用していません( 'types 'const T'と 'int'には互換性のないcv-qualifier'があります)。 –
それは私だけか、あなたはその逆でしたか?コピーc-torは 'remove_const'を使います。あなたの記述と' bar'を使うコードは** ** const **を追加する場合です。 –
@ YehezkelB: 'foo'は 'foo 'から構築可能でなければならないので、コンストラクタの引数の 'const'を削除する必要があります。私は*書くと正しいと思う。 –