0

私の質問は:

パラメータがリテラル文字列かどうかを判断する方法はありますか?

template<class T>
bool IsLiteral(T arg)
{
    // How to implement?
}

また

template<class T>
struct IsLiteral { enum { value = ??? }; };

次のコードを記述できるようにします。

char* p = "Hello";

assert(IsLiteral(p)); // fail.
assert(IsLiteral("Hello")); // never fail.
assert(IsLiteral<decltype("Hello")>::value); // never fail.
4

3 に答える 3

0

「文字列リテラル」はソース コード用語です。コードがコンパイルされると、メモリ ロケーションに割り当て/ロードされます。その値を使用するコードは、それが実行時に作成されたのかコンパイル時に作成されたのかを気にしたり認識したりしません。

于 2013-09-16T03:04:09.210 に答える
0

文字列リテラルを検出する方法はありません。検出できるのは、引数が次の固定サイズの配列であることですchar const

template <std::size_t N>
bool IsLiteral(char const (&)[N]) {
    return true;
}
template <std::size_t N>
bool IsLiteral(char (&)[N]) {
    return false;
}
template <typename T>
bool IsLiteral(T) {
    return false;
}

ただし、これら2つの用途を区別できるとは思いません。

char const array[] = { 'a' };
IsLiteral(array);
IsLiteral("foo");
于 2013-09-16T03:05:47.903 に答える
0
于 2013-09-16T03:16:52.200 に答える