template26.c

来自「linux下编程用 编译软件」· C语言 代码 · 共 116 行

C
116
字号
// { dg-do run  }// PRMS Id: 6275// Bug: unification fails for call to find_parameter_in_stack.#include <stdio.h>#include <stdlib.h>const int max_stack_size = 20;template <class T>class Stack {  private:    T objects[max_stack_size];    int nobjects;  public:    Stack(): nobjects(0) {}    void push(const T&a) {        if (nobjects >= max_stack_size) {            fprintf(stderr,"Stack: overflow\n");            abort();          }        objects[nobjects++] = a;      }    T pop() {        if (!nobjects) {            fprintf(stderr,"Stack: underflow\n");            abort();          }        nobjects -= 1;        T result = objects[nobjects];        return result;      }    T top() const {        if (!nobjects) {            fprintf(stderr,"Stack: underflow\n");            abort();          }        return objects[nobjects - 1];      }    int n() const { return nobjects; }    T operator[](int i) { return objects[i]; }};template <class T>class Parameter {    T parameter_;    int is_set_;    int overrides_;  public:    Parameter(): is_set_(0), overrides_(0) {}    void set(const T& a) { parameter_ = a; is_set_ = 1; }    void override(int overrides = 1) { overrides_ = overrides; }    const T& value() const { return parameter_; }    int overrides() const { return overrides_; }    int is_set() const { return is_set_; }};template <class T1, class T2>T2find_parameter_in_stack(Stack<T1>& stack, Parameter<T2>& (T1::*access)()){  T2 result;  int have_result = 0;  for (int i=stack.n()-1; i>=0; i--) {      if ((stack[i].*access)().is_set()) {          if (!have_result || (stack[i].*access)().overrides()) {              result = (stack[i].*access)().value();              have_result = 1;            }        }    }  return result;}class A {  private:    Parameter<int> a_;  public:    A() { }    Parameter<int>& a() { return a_; }};intmain(int, char**){  Stack<A> A_stack;  A a1;  A a2;  a1.a().set(1);  a2.a().set(2);  A_stack.push(a1);  A_stack.push(a2);  int val = find_parameter_in_stack(A_stack, &A::a);  printf("val = %d\n", val);  if (val != 2)    return 1;  A_stack.pop();  A_stack.pop();  a1.a().override();  A_stack.push(a1);  A_stack.push(a2);  val = find_parameter_in_stack(A_stack, &A::a);  printf("val = %d\n", val);  if (val != 1)    return 1;  return 0;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?