c++ - 尝试将字符串文字作为模板参数传递

标签 c++ string templates c++11 literals

<分区>

我正在尝试找到一种舒适的方式来将字符串文字作为模板参数传递。我不关心支持尽可能多的编译器,我使用的是带有 --std=c++0x 的最新版本的 g++。

我尝试了很多可能的解决方案,但都让我失望。我有点想放弃了,但首先我想知道为什么其中有几个失败了。

他们在这里:

#include <iostream>
#include <string>

using namespace std;

struct String {
    char const *m_sz;

    constexpr String(char const *a_sz)
        :
    m_sz(a_sz) {}

    char const *operator () () const {
        return m_sz;
    }
};

template<class _rstr>
string const Get() {
    return _rstr();
}

int main() {
    cout << Get<String("hello")>() << endl;
    return 0;
}

和:

#include <iostream>
#include <string>

using namespace std;

struct String {
    char const *m_sz;

    constexpr String(char const *a_sz)
        :
    m_sz(a_sz) {}
};

template<String const &_rstr>
string const Get() {
    return _rstr.m_sz;
}

int main() {
    String constexpr str = "hello";
    cout << Get<str>() << endl;
    return 0;
}

我们的目标是找到一种舒适的方式将字符串文字传递给无用的 Get 函数,该函数将其模板参数作为 std::string 对象返回。

编辑:抱歉,也许我的主要问题不清楚。我的问题是:为什么这两个片段会失败?

最佳答案

您不能将字符串文字用作模板参数,因为 一个的两个实例是否未指定的简单原因 具有相同文本的文字是否是相同的对象。其他 单词,给定:

template <char const* str>
class TC {};

TC< "xyz" > v1;
TC< "xyz" > v2;

未指定v1v2 是否具有相同的类型 或不。

您可以使用 char const[] 变量作为模板参数, 然而,因为它们有一个定义的地址:

template <char const* str>
class TC {};

extern char const xyz[] = "xyz";
TC< xyz > v1;
TC< xyz > v2;

在这种情况下,v1v2 保证具有相同的 类型。

编辑:

我认为 C++11 消除了对 extern 的需要 字符串的定义,至少如果字符串和 实例化都在同一个翻译单元中。我不是 当然,但是;有一次我做了这样的事情,我没有 可以访问 C++11。

关于c++ - 尝试将字符串文字作为模板参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18031818/

相关文章:

C - sprintf 打印变量名

c++ - std::less: error C2661: 'std::less<_Ty>::less': 没有重载函数需要 2 个参数

c++ - 内存访问冲突错误c++

c++ - 终止 PPL 线程池中的线程

JavaScript 拆分,更改零件编号

c++ - 函数调用无法正常工作

javascript - Django - 从 javascript 附加一个可重用的模板

c++ - 'std::vector' : 'U64' is not a valid template type argument for parameter '_Ty'

c++ - 具有虚拟析构函数的基类的子类中的默认析构函数

C++ push_back 二维双端队列