0

所以,我希望能够拥有一个静态的 const 编译时结构,它通过使用模板来保存基于字符串的一些值。我只需要最多四个字符。我知道'abcd'的类型是int,'ab','abc'也是,虽然'a'是类型char,但它适用于atemplate<int v> struct

我想要做的是取一些 const char “abcd”的大小为 2、3、4、5,并具有与使用“abcd”相同的功能。请注意,我不是指 1、2、3 或 4,因为我期望空终止符。

cout << typeid("abcd").name() << endl; 告诉我这个硬编码字符串的类型是char const [5],最后包含空终止符。

我知道我需要将值作为字符旋转,因此它们表示为整数。

我不能使用constexpr,因为 VS10 不支持它(VS11 也不支持..)

所以,例如在某个地方定义了这个模板,然后是最后一行

template <int v> struct something {
    static const int value = v;
};

//Eventually in some method
cout << typeid(something<'abcd'>::value).name() << endl;

工作得很好。

我试过了

template<char v[5]> struct something2 {
    static const int value = v[0];
}

template<char const v[5]> struct something2 {
    static const int value = v[0];
}

template<const char v[5]> struct something2 {
    static const int value = v[0];
}

它们都是单独构建的,但是当我进行测试时,

cout << typeid(something2<"abcd">::value).name() << endl;

我明白了

'something2' : invalid expression as a template argument for 'v'
'something2' : use of class template requires template argument list

这是不可行的还是我误解了什么?

4

3 回答 3

1

14.1 列出了可接受的非类型模板参数类型:

— 整数或枚举类型,
— 指向对象的指针或指向函数的指针, — 指向对象的
左值引用或指向函数的左值引用,
— 指向成员的指针,

数组不属于这些类别中的任何一个。

14.3.2/1 列出了允许作为模板参数的类别,14.3.2/2 继续说:

注意:字符串文字 (2.14.5) 不满足任何这些类别的要求,因此不是可接受的模板参数。

因此你不能做你想做的事。

于 2012-10-03T21:34:53.940 回答
0

从标准来看,你不能。

14.3.2.1:

非类型、非模板模板参数的模板参数应为以下之一:

  • 整数或枚举类型的整数常量表达式;或者
  • 非类型模板参数的名称;或者
  • 具有外部链接的对象或函数的地址,包括函数模板 > 和函数模板 ID,但不包括非静态类成员,表示为 & id-> 表达式,如果名称引用函数或数组,则 & 是可选的,或者如果 >corresponding template-parameter 是一个参考;或者
  • 指向成员的指针,如 5.3.1 中所述。
于 2012-10-03T21:38:39.613 回答
0

有一种方法可以接近你想要的。可能这对您有用,尽管它增加了要维护的额外代码级别。

它需要定义带有外部链接的 const char 数组,然后使用这些数组的名称从模板中实例化类。当然,在实际使用中,这段代码会被分成不同的 .h 和 .cpp 文件。

extern const char a[] = "a";
extern const char b[] = "b";
extern const char ab[] = "ab";
extern const char abc[] = "abc";

template <const char * const  T> class Test
{
public:
    Test() {str = typename T;};
private:
    const char * str;
};


SomeFunction()
{
    Test<a> A;
    Test<b> B;
    Test<ab> AB;
    Test<abc> ABC;
}
于 2012-10-03T22:23:11.200 回答