防止实例化未使用的默认函数参数

时间:2011-08-10 05:10:22

标签: c++ templates default-arguments

假设我有一个函数将函数指针作为参数,该参数有一个默认参数。

template <typename T>
T* default_construct()
{
    return new T();
}

template <typename T>
void register(T* (*construct)() = default_construct<T>)
{
    // Save that function pointer for later
}

假设我想在我的班级Foo上使用注册,但Foo没有默认构造函数,因此我的default_construct将无法使用它。显而易见的解决方案是做这样的事情:

Foo* construct_Foo()
{
    return new Foo("String argument", 123);
}

SomeFunc()
{
    // ...
    register<Foo>(construct_Foo);
    // ...
}

但这不起作用。即使register<Foo>只能在一个地方调用,并且它传递了一个要使用的函数,default_construct<Foo>仍然会被编译器实例化,并且我得到了编译器错误。似乎因为它永远不会被使用,它应该被跳过,但我想情况并非如此。

有什么方法可以阻止default_construct在被用作默认参数时被实例化?我能想到的唯一解决方案是将它放在模板中,但似乎应该有更好的解决方案。

1 个答案:

答案 0 :(得分:6)

这是解决问题的一种解决方案,因为它不使用默认参数:

template <typename T>
T* default_construct()
{
    return new T();
}

template <typename T>
void register(T* (*construct)())
{
    // Save that function pointer for later
}

template<typename T>
void register()
{
    register<T>(default_construct<T>);
}

请注意,register是一个C ++关键字,但是:)