结构数组作为模板参数

时间:2012-11-27 02:04:43

标签: c++ templates c++11 typetraits

我正在尝试将指针传递给struct s数组作为模板参数。一段时间后我设法做到了:

struct something{};

constexpr const something single;
constexpr const something array[12];
template<const something* arg> void f() {}

template<typename T>
constexpr T* workaround(T* v){
    return v;
};

void bind(){
    f<&single>();                       //OK
    f<array>();                         //NO
    f<&array>();                        //NO
    f<&array[0]>();                     //NO
    f<workaround(array)>();             //NO
    f<(const something*)array>();       //OK
}

这是极少数情况下,数组不能透明地用作指针,还是编译器错误?

2 个答案:

答案 0 :(得分:1)

我实际上认为,如果只是正确地声明定义f<array>();,那么最简单的调用形式array会起作用:

struct Elem
{ };

constexpr const Elem array[5] { {} , {} , {} , {} , {} };

template<const Elem* arg> void f()
{ }

int main()
{
  f<array>();
  return 0;
}

我唯一改变的事情(除了将数组从12个元素减少到5个元素之外)就是为array添加初始值设定项。

(这为我编译,使用GCC 4.7.2。)

答案 1 :(得分:1)

使用Apple clang v4.1搞砸了这个,我已经到了下面编译的代码了。我不得不承认我不知道Clang坚持singlearray的外部链接是否正确。此外,基于jogojapan的修改,没有特别的原因。

struct Elem {};

extern const Elem single;
extern const Elem array[3];

constexpr const Elem single {};
constexpr const Elem array[3] {{},{},{}};

template<const Elem* arg> void f()
{ }

int main()
{
    f<&single>();
    f<array>();
    return 0;
}

FWIW,我在遇到这个问题后在黑暗中到达了这个镜头: http://lists.apple.com/archives/xcode-users/2006/Jun/msg00799.html