3

我想要一个带有这个接口的功能。

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 );
4

3 回答 3

1

你的意思是这样的吗?

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");

我很好奇这个谜题的真正答案是什么。

于 2010-12-04T00:43:08.773 回答
1

你总是可以尝试

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

也许这就是你需要的。

于 2010-12-06T14:52:19.227 回答
0

我过度思考了这个问题,也让其他人感到困惑。除非使用 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.
于 2010-12-07T01:26:41.500 回答