C++:有没有办法在线定义静态数组?

Mor*_*hai 12 c++ templates

我想定义一个简单的模板函数,它接受运行时值并确定它是否是某些可能值的成员.

用法:

int x;  // <- pretend this came from elsewhere...
if (isoneof(x, {5,3,9,25}) ...
Run Code Online (Sandbox Code Playgroud)

就像是:

template <typename T, size_t size>
bool isoneof(T value, T (&arr)[size])
{
    for (size_t i = 0; i < size; ++i)
        if (value == arr[i])
            return true;
    return false;
}
Run Code Online (Sandbox Code Playgroud)

我认为这注定要失败,因为我没有看到如何创建内联静态数组.

我可以用:

int kPossibilities[] = {5,3,9,25};
if (isoneodf(6, kPossibilities)) ...
Run Code Online (Sandbox Code Playgroud)

稍微改变isoneof:

template <typename T1, typename T2, size_t size>
bool isoneof(T1 value, const T2 (&arr)[size])
{
    for (size_t i = 0; i < size; ++i)
        if (value == arr[i])
            return true;
    return false;
}
Run Code Online (Sandbox Code Playgroud)

这也使它更加灵活.

有人提供改进吗?定义"内联静态值集"的更好方法是什么?

Kor*_*icz 12

如果你喜欢这样的话,那么你将是Boost.Assign的一个非常满意的用户.

Boost.Assign实际上证明了这种语义可能的,但是看一下assign的来源就会说服你自己不想这样做:)

但是你可以创建这样的东西:

if (isoneof(x, list_of(2)(3)(5)(7)(11)) { ...
Run Code Online (Sandbox Code Playgroud)

...缺点是你必须使用它boost::array作为参数而不是内置数组(感谢Manuel) - 然而,这是一个真正开始使用它们的好时机:>


xto*_*ofl 5

它可以在下一个C++标准中使用.

到目前为止,您可以通过例如重载operator,来启动静态数组的静态对象来解决它.

注意:这个实现是O(n ^ 2)并且可能是优化的 - 它只是为了得到这个想法.

using namespace std;

template< typename T, size_t N > 
struct CHead {
    T values[N];
    template< typename T > CHead<T,N+1> operator,( T t ) { 
      CHead<T,N+1> newhead;
      copy( values, values+N, newhead.values);
      newhead.values[N]=t;
      return newhead;
    }
    bool contains( T t ) const { 
       return find( values, values+N, t ) != values+N; 
    }
};

struct CHeadProto {
  template< typename T > 
  CHead<T,1> operator,( T t ) { 
     CHead<T,1> h = {t}; 
     return h; 
  }
} head;



int main()
{
  assert( (head, 1,2,3,4).contains(1) );
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

  • +1:对于代码,但是虽然很好,但我不会粗略地重载`,`运算符只是为了语法糖:> (2认同)