我正在尝试找到一种舒适的方法来将字符串文字作为模板参数传递。我不关心支持尽可能多的编译器,我正在使用最新版本的 g++--std=c++0x
.
我尝试了很多可能的解决方案,但都令我失望。我有点放弃了,但首先我想知道why其中有几个失败了。
他们来了:
#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;
}
And:
#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 对象返回。
编辑:抱歉,也许我的主要问题不清楚。我的问题是:为什么这两个片段失败了?
您不能使用字符串文字作为模板参数,因为
原因很简单,未指定 a 的两个实例是否
具有相同文本的文字是否是同一对象。其他
单词,给出:
template <char const* str>
class TC {};
TC< "xyz" > v1;
TC< "xyz" > v2;
尚不清楚是否v1
and v2
有相同类型
或不。
您可以使用char const[]
变量作为模板参数,
但是,由于它们有一个定义的地址:
template <char const* str>
class TC {};
extern char const xyz[] = "xyz";
TC< xyz > v1;
TC< xyz > v2;
在这种情况下,v1
and v2
保证有相同的
类型。
EDIT:
我认为 C++11 消除了对extern
在
字符串的定义,至少如果字符串和
实例化都在同一个翻译单元中。我不是
当然,但是;有一次我做了这样的事,我没有
可以访问 C++11。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)