Как объявить шаблонную функцию с необязательным параметром времени компиляции? - PullRequest
3 голосов
/ 04 декабря 2010

Я хочу функцию с этим интерфейсом.

func<Type1,CompileOption>( Type2 value)
//or
func<Type1>( Type2 value)

Первый параметр времени компиляции является типом. Требуется при каждом вызове функции.
Второй параметр времени компиляции является необязательным. Он используется для изменения поведения func.
Сама функция основана на типе обычного параметра (Type2).

Можно ли создать подобный интерфейс?

Если это невозможно, есть ли способ получить подобное поведение? например что-то, что действует как шаблонная функция, которая принимает два параметра времени компиляции, где второй является необязательным?

Наивный подход не работает.

// invalid syntax
template< typename Type1, typename CompileOption = Default, typename Type2>
void func( Type2 t2 );

// Does the wrong thing.
// CompileOption Parameter now change Type2.
template< typename Type1, typename Type2, typename CompileOption = Default>
void func( Type2 t2 );

//This kinda expresses what I'm looking for
template<typename Type2>
template<typename Type1, typename Optional = Default >
void func( Type2 t2 );

Ответы [ 3 ]

1 голос
/ 06 декабря 2010

Вы всегда можете попробовать

template<typename Type1, typename Optional = Default >
struct A
{
    template<typename Type2>
    void func( Type2 t2 ) {
        // function body
    }
};

Может быть, это то, что вам нужно.

1 голос
/ 04 декабря 2010

Вы имеете в виду что-то подобное?

template<typename Type1, typename Type2, typename Option>
void foo (Type2 arg)
{
    ... code ...
}

template<typename Type1, typename Type2>
void foo (Type2 arg)
{
    foo<Type1, Type2, DefaultOption>(arg);
}

Редактировать: приведенный выше фрагмент работает, но имеет недостаток, заключающийся в том, что Type2 должен быть явно указан в вызовах.

Я должен признать, что не могу придумать хорошее решение для полного шаблона; самое близкое, что я мог получить, это использовать пустые аргументы метода:

struct DefaultOption { ... } DEFAULT;
struct OtherOption { ... } OTHER;

template<typename Type1, typename Type2, typename Option>
void foo (Type2 arg, Option)
{
    ... code ...
}

template<typename Type1, typename Type2>
void foo (Type2 arg)
{
    foo<Type1, Type2>(arg, DEFAULT);
}

Позволяет звонить в форме

foo<std::string>(1, DEFAULT);
foo<std::string>(1.0, OTHER);
foo<std::string>("Hello");

Мне любопытно, каков реальный ответ на эту загадку.

0 голосов
/ 07 декабря 2010

Я обдумал проблему и запутал всех остальных.Невозможно написать одну функцию, если не используются расширения C ++ 0x.Однако написать его с двумя перегруженными функциями довольно просто.

template< typename Type1, typename Option, typename Type2 >
void func( Type2 t2 )
{ /* ... */ }

template< typename Type1, typename Type2 >
void func( Type2 t2 )
{ func<Type1,Default,Type2>(t2); }

func<int,fast_t>(20.f);
func<float>(30); // uses Default as Option
func<float,Default>(30); //exact same call as above.
...