8

我以前见过这样的示例代码

class C
{
    C();
    ~C();
    foo(T1, T2);
}

C::foo(T1, T2)
{
    //not using T1/T2
}

与这样的传统代码相比

class D
{
    D();
    ~D();
    bar(T1 t1, T2 t2);
}

D::bar(T1 t1, T2 t2)
{
    //using t1 and t2
}

我想知道不为可用性定义类型变量的目的是什么?大多数人这样做只是为了暗示api的那些参数当前没有使用,而是为了确保将来的向后兼容性?

是否可能用于 RTTI,或者引用静态变量(尽管我看到的各种示例都没有将它用于此目的,它们甚至没有模板化函数,变量根本没有使用)。我试过搜索这个功能,但我什至不确定它叫什么或搜索什么。

基本上,使用这种方法的原因/好处/缺点是什么?

4

3 回答 3

11

通常这样做是为了抑制有关未使用变量的编译器警告。当您不创建变量名时,编译器不会警告您该变量未在函数中使用。

就像您所说的那样,通常不会将参数用于特定实现:

class an_iface
{
public:
    an_iface();

    virtual int doSomething(int valNeeded)=0;
}

#define NOT_SUPPORTED -1
class something : public an_iface
{
public:
    something();
    int doSomething (int) { return NOT_SUPPORTED; }
}

class somethingMore : public an_iface
{
public:
    somethingMore();
    int doSomething(int stuff) { return stuff * 10; }
}
于 2012-05-08T07:08:54.783 回答
6

除了@dag 提到的之外,没有参数名称的函数定义在模板特化中找到了它的用途。我知道您已经提到您发布的示例中没有模板,但为了完整起见,我想发布这个用例:

假设您已经为容器定义了一个erase函数。std但是您希望erase_helper根据容器类型来做不同的实际工作。一种常见且可接受的做法是使用traits.

// Tags for containers
struct vector_tag {};
struct map_tag {};

// Trait class
template <typename C> struct container_traits;

// Specialization of trait class
template <typename T, typename A>
  struct container_traits<std::vector<T, A>>
  {
    typedef vector_tag category;
  };

template <typename K, typename V, typename C, typename A>
  struct container_traits<std::map<K, V, C, A>>
  {
    typedef map_tag category;
  };

// Helper function
template <typename Container, typename X>
  void erase_helper(Container& c, const X& x, vector_tag)  // <-- no param name
  {
    // Erase element from vector
  }

template <typename Container, typename X>
  void erase_helper(Container& c, const X& x, map_tag)  // <-- no param name
  {
    // Erase element from map
  }

// Function interface
template <typename Container, typename X>
  void erase(Container& c, const X& x)
  {
    erase_helper(c, x, typename container_traits<Container>::category());
  }

你可以在这里看到,erase_helper第三个参数没有名字。参数类型告诉编译器在模板实例化阶段选择正确的函数。

于 2012-05-08T08:33:32.803 回答
3

在更多情况下,参数设计在实现之前,更直接地受到架构的影响

参数可能未使用,因为:

  1. 重载具有比派生类中所需参数更多的虚函数
  2. 由于历史原因存在参数,并且不想更改 api
  3. 考虑未来的需要
于 2012-05-08T07:24:15.287 回答