gpt4 book ai didi

c++ - 模板化 [] 或 () 运算符重载 - 可能不使用类型作为参数?

转载 作者:行者123 更新时间:2023-11-30 05:20:47 27 4
gpt4 key购买 nike

以同样的方式,你可以做到这一点......

template< typename T >
T GetValue( const int index ) const;

char c = GetValue< char >( 0 );

...是否可以这样做:

template< typename T >
T operator[]( const char* key ) const;

char c = GetValue< char >( "some key" ); // *** This doesn't compile ***

...或者这个:

template< typename T >
T Foo::operator()( const char* key ) const;

char c = Foo< char >( "some key" ); // *** This doesn't compile ***

上面的两个例子由于 而无法编译,没有它我会得到“无法推断类型”错误(我明白为什么会这样)。

我能得到的最接近的是指定一个“默认值”,它摆脱了“无法推断类型”错误,所以像这样:

template< typename T >
T operator()( const char* key, const T& defaultValue ) const;

char c = Foo( "some key", 'x' );

但是,这并不是我真正想要的。

编辑

本质上,这就是我正在做的:

class Collection
{
...

template< typename T >
T operator[]( const char* key ) const;

template< typename T >
void Add( const char* key, const T& value );

...
}

这就是我想使用它的方式:

Collection col;
col.Add( "some key", 123 );
col.Add( "another key", 'x' );
col.Add( "and another", 1.23 );

char c = col< char >[ "another key" ];

最佳答案

如果我对你的理解是正确的,你想要实现这样的目标:

struct S {
template< typename T >
T operator[]( const char* key ) const {
return key[0];
}
template< typename T >
T operator()( const char *key) const {
return key[0];
}
};

int main() {
S s;
char c = s.operator[]<char>("some key");
c = s.operator()<char>("some key");
(void)c;
}

[live demo]


如果该语法不适合您的应用程序,您可以尝试使用标记调度:

struct S {
template< typename T >
T operator()(const char *key, T) const {
return key[0];
}
};

int main() {
S s;
char c = s("some key", char{});
(void)c;
}

[live demo]

然而,这可能更难应用于 operator[],因为它只能接受一个参数。

关于c++ - 模板化 [] 或 () 运算符重载 - 可能不使用类型作为参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40526984/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com