web-dev-qa-db-ja.com

現代のC ++では、文字列リテラルをパラメーターとしてC ++テンプレートに渡すことは可能ですか?

「モダンC++」(C++ 17以降)で、パラメーターとして文字列リテラルをC++テンプレートに渡すことは可能ですか?

コンストラクター引数を使用してこれを実行できることを理解しています。 cppファイルの奥深くに埋めるよりも、テンプレート引数として使用する方が便利だと思いました。多分これが現代のC++の新機能であるかどうか興味がありました。私がやろうとしていることの以下の擬似コードを参照してください:

擬似コードの例:

// Header File /////////////////////////
template<constexpr string Name>
class ModuleBase {
public:
    ModuleBase();
    string name;
};

class xyz : ModuleBase<"xyz"> {
public:
    xyz();
};

// Cpp File //////////////////////////
template<string_literal Name>
ModuleBase<Name>::ModuleBase() {
    name = Name;
}

xyz::xyz() : ModuleBase() {

}
50
Bill Moore

はい、 c ++ 2 で。

問題は、テンプレートの非型引数の一意性を判断することが難しいことでした。

c ++ 2<=>宇宙船オペレーターの比較。ユーザーが提供しない場合(およびユーザーが提供しない場合のみに基づく<=>順番に、再帰的に繰り返します(および 他の要件はほとんどありません。p0732 を参照)。この型は、非型テンプレート引数として使用できます。

このような型は、未加工の"strings"constexprコンストラクターで、 c ++ 17 推論ガイドを使用して、自動サイズ調整を行うことを含みます。

格納されるデータのサイズはおそらく型の一部になるので、型を auto typed non-type parameter またはそうでなければ自動推論する必要があります。タイプ。


テンプレートの実装をcppファイルに配置することは、通常は悪い考えです。しかし、それは別の質問です。

c ++ 2 が得られるまで、そして boost があれば、次のマクロが役立つことがあります。

#define C_STR(str_) boost::mpl::c_str< BOOST_METAPARSE_STRING(str_) >::value

次に、次のように使用します。

template<const char* str>
structe testit{
};
testit<C_STR("hello")> ti;
1
darune