C 样式字符串作为模板参数?

新手上路,请多包涵

C-Style 字符串可以用作模板参数吗?

我试过了:

 template <char *str>
struct X
{
    const char *GetString() const
    {
         return str;
    }
};

int main()
{
    X<"String"> x;
    cout<<x.GetString();
}

虽然我对类定义没有抱怨,但实例化产生 'X' : invalid expression as a template argument for 'str' (VC)。

原文由 cvb 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.9k
2 个回答

字符串文字不能用作模板参数

更新:如今,在提出并回答了这个问题几年后,可以使用字符串文字作为模板参数。使用 C++11,我们可以使用字符包作为模板参数 ( template<char ...c> ),并且 可以 将文字字符串传递给这样的模板。

但是,这会起作用:

 template <char const *str>
struct X
{
    const char *GetString() const
    {
         return str;
    }
};

char global_string[] = "String";

int main()
{
    X<global_string> x;
    cout<<x.GetString();
}

原文由 moonshadow 发布,翻译遵循 CC BY-SA 4.0 许可协议

很抱歉在这么老的问题上发帖,但我觉得这是在不使用存储的情况下实际传递文字作为参数的最干净的方法。

将字符串编码为类型:

 template <char... chars>
using tstring = std::integer_sequence<char, chars...>;

创建用户定义的文字运算符:

 template <typename T, T... chars>
constexpr tstring<chars...> operator""_tstr() { return { }; }

并根据需要使用部分特化来恢复字符数据:

 template <typename>
struct X;

template <char... elements>
struct X<tstring<elements...>> {
    const char* GetString() const
    {
        static constexpr char str[sizeof...(elements) + 1] = { elements..., '\0' };
        return str;
    }
};

这允许您编写:

 X<decltype("my_string"_tstr)>

用户定义的文字使用 C++14 中没有的非标准 ( n3599 ) 功能,但最近的 GCC 和 Clang 版本支持该功能,并且希望将在 C++1z 中重新考虑。

原文由 Matt Bierner 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题