假设我正在编写一个API,我的一个函数采用一个代表一个通道的参数,并且只会在值0和15之间.我可以这样写:
void Func(unsigned char channel)
{
if(channel < 0 || channel > 15)
{ // throw some exception }
// do something
}
Run Code Online (Sandbox Code Playgroud)
或者我是否利用C++作为强类型语言,并使自己成为一种类型:
class CChannel
{
public:
CChannel(unsigned char value) : m_Value(value)
{
if(channel < 0 || channel > 15)
{ // throw some exception }
}
operator unsigned char() { return m_Value; }
private:
unsigned char m_Value;
}
Run Code Online (Sandbox Code Playgroud)
我的功能现在变为:
void Func(const CChannel &channel)
{
// No input checking required
// do something
}
Run Code Online (Sandbox Code Playgroud)
但这总是矫枉过正吗?我喜欢自我记录,并保证它是它所说的,但它是否值得支付这样一个对象的构造和破坏,更不用说所有额外的打字?请让我知道您的意见和备选方案.
什么是Java中的原始类型?
原始类型和引用类型之间有什么区别?
Java有多少原始类型,它们是什么?
有人能告诉我什么是强打字和弱打字意味着什么更好?
prototyping static-typing weak-typing strong-typing dynamic-typing
有没有办法对相同类型的typedef强制执行显式转换?我要处理utf8,有时我会对字符数和字节数的索引感到困惑.所以有一些typedef很好:
typedef unsigned int char_idx_t;
typedef unsigned int byte_idx_t;
Run Code Online (Sandbox Code Playgroud)
除此之外,您需要在它们之间进行显式转换:
char_idx_t a = 0;
byte_idx_t b;
b = a; // compile warning
b = (byte_idx_t) a; // ok
Run Code Online (Sandbox Code Playgroud)
我知道C中不存在这样的功能,但也许你知道一个技巧或编译器扩展(更好的gcc).
编辑 我仍然不喜欢一般的匈牙利符号.由于项目编码惯例,我无法将它用于此问题,但我现在在另一个类似的情况下使用它,其中类型相同且含义非常相似.我不得不承认:它有所帮助.我永远不会用起始"i"来声明每个整数,但是就像Joel的重叠类型的例子一样,它可以挽救生命.
从PHP7开始,我们现在可以使用标量typehint并在每个文件的基础上请求严格类型.使用这些功能是否有任何性能优势?如果有,怎么样?
在互联网周围,我只发现了概念上的好处,例如:
我只是在玩新的角度类型表单 api,不知道如何输入FormGroup
在不声明特定“FormInterface”女巫必须与原始界面相匹配的情况下进行键入。
也许我错过了一些东西,或者根本不可能这样做。
我能够使事情正常工作(下面的示例),但我不喜欢这里的UserForm
接口声明,它没有对User
接口的引用,并且必须是它的镜像副本,但带有FormControl<>
字段。
在这种情况下是否可以FormGroup
仅使用User
界面进行输入?
stackblitz上提供完整的工作示例
用户模型.ts
export interface User {
firstName: string;
lastName: string;
email: string;
age: number | null;
}
Run Code Online (Sandbox Code Playgroud)
用户服务.ts
@Injectable()
export class UserService {
add(user: User): void {
console.log('Add user', user);
}
}
Run Code Online (Sandbox Code Playgroud)
应用程序组件.ts
interface UserForm {
firstName: FormControl<string>;
lastName: FormControl<string>;
email: FormControl<string>;
age: FormControl<number | null>;
}
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
})
export class AppComponent implements OnInit {
form: FormGroup<UserForm>;
constructor(private …
Run Code Online (Sandbox Code Playgroud) 我在C#中真正喜欢的是通用列表.一个只能包含一种对象的列表.在Cocoa/Objective-C中有类似通用列表的东西吗?到目前为止,我只知道NSArray
谁将指向任何对象.
我有一个简单的登录方案,要求用户在Typescript中输入电子邮件和密码.我需要创建一些类型来获得强类型并将其发送到后端.
应该写成:
export interface UserLogin {
email: string;
password: string;
}
//OR
export class UserLogin {
email: string;
password: string;
}
Run Code Online (Sandbox Code Playgroud)
以及如何知道何时使用这些方案?
我正在使用带有打字稿的 vue 组合 api。
如何使用打字稿打字系统对组件道具进行强类型输入?
如果我有一个普通(弱)枚举,我可以使用它的枚举值作为非类型模板参数,如下所示:
enum { Cat, Dog, Horse };
template <int Val, typename T> bool magic(T &t)
{
return magical_traits<Val>::invoke(t);
}
Run Code Online (Sandbox Code Playgroud)
并称之为: magic<Cat>(t)
据我所知,如果我有一个强类型的枚举,并且不想硬编码枚举类型,我最终得到:
enum class Animal { Cat, Dog, Horse };
template <typename EnumClass, EnumClass EnumVal, typename T> bool magic(T &t)
{
return magical_traits<EnumVal>::invoke(t);
}
Run Code Online (Sandbox Code Playgroud)
现在我得写:magic<Animal, Animal::Cat>(t)
这似乎是多余的.
有没有办法避免输入枚举类和值,缺少
#define MAGIC(E, T) (magic<decltype(E), E>(T));
Run Code Online (Sandbox Code Playgroud) c++ templates strong-typing template-argument-deduction c++17
strong-typing ×10
types ×3
c++ ×2
typescript ×2
angular ×1
angular14 ×1
api ×1
c ×1
c++17 ×1
class ×1
cocoa ×1
interface ×1
java ×1
list ×1
objective-c ×1
performance ×1
php ×1
php-7 ×1
prototyping ×1
template-argument-deduction ×1
templates ×1
typechecking ×1
typedef ×1
vue.js ×1
weak-typing ×1
web ×1