例如,以下代码片段在 VC++ 2010 中编译:
template<int Rows, int Columns = Rows>
struct Matrix { };
Matrix<4> m;
Run Code Online (Sandbox Code Playgroud)
请注意, 的默认参数Columns取决于 的参数值Rows。
但是C++11(或更早版本)中的这种标准行为是我可以在任何地方依赖的吗?
我很确定这是不可能的,但如果某种方式存在(可能通过编译器提供的宏),它对我来说非常有用,所以我在这里发布它。假设我有一个函数:
void func( int param1, bool param2=false){ ... }
Run Code Online (Sandbox Code Playgroud)
param2这里已经给出了默认值。是否有任何机制可以确定param2是明确设置为其默认值false还是自动传递?换句话说,从 function 内部func,是否可以区分以下两个调用?我正在使用 Microsoft Visual C++ 编译器。
func(1, false);
Run Code Online (Sandbox Code Playgroud)
和
func(1);
Run Code Online (Sandbox Code Playgroud) 案例:基类 (A) 的函数 (doSomething) 具有默认参数(参数:T = foo),子类 (B) 使用不同的默认参数(参数:T = bar)覆盖该函数。但随后被称为A。
编辑:对原始代码表示歉意,所以实际上发生的事情基本上如下:
class Foo
{
func doSomething(a: String = "123")
{
print(a)
}
}
class Bar: Foo
{
override func doSomething(a: String = "abc")
{
print("Using Bar method body... but not Bar's default a value!")
print(a)
}
}
(Bar() as Foo).doSomething()
// Prints:
// Using Bar method body... but not Bar's default a value!
// 123
Run Code Online (Sandbox Code Playgroud)
它使用函数体但不使用函数默认参数是错误还是预期行为?
可以从函数扩展或其他任何地方访问函数的默认参数值吗?
fun DieRoll.cheatRoll():Int = roll(min = max -1)
fun roll(min: Int = 1, max: Int = 6): Int = (min..max).rand()
Run Code Online (Sandbox Code Playgroud) 在研究 JavaScript 的功能时,我在同一函数中使用了默认参数和扩展语法。
let whatIsThis = (a, b = 2, ...c) => {
console.log("a = " + a, "b = " + b,"c = " + c)
}
whatIsThis(a = 1, c = [2,3,4,5,6,7,8])
Run Code Online (Sandbox Code Playgroud)
运行后,我预计输出如下:
"a = 1"
"b = 2"
"c = 2,3,4,5,6,7,8"
Run Code Online (Sandbox Code Playgroud)
但我却得到了这个:
"a = 1"
"b = 2,3,4,5,6,7,8"
"c = "
Run Code Online (Sandbox Code Playgroud)
为什么这不起作用?
对于简单的继承,例如
class Base:
def __init__(self, env: str = 'prod'):
#...
class Derived(Base):
def __init__(self, env: str = 'prod'):
super().__init__(str)
Run Code Online (Sandbox Code Playgroud)
如何避免在两个类中重新定义默认构造函数参数?如果我实例化Derived()我确实想env默认为'prod',我只是不想在多个类中重新定义该值。如果我后来决定默认值应该是其他值(例如'dev'),那么我将不得不更改所有派生构造函数。
我在想类似的事情
class Base:
def __init__(self, env: str = 'prod'):
#...
class Derived(Base):
def __init__(self, env: str = None):
if env is None:
super().__init__()
else:
super().__init__(env)
Run Code Online (Sandbox Code Playgroud)
或者也许将默认值定义为基类中的全局常量?这两种方法似乎都过于复杂。什么是 Pythonic 方式?
python inheritance constructor default-parameters python-3.x
假设一个 kotlin 函数是这样的:
fun f(p1: T1? = null, p2: T2? = null, ..., pN: TN? = null) {
// ...
}
Run Code Online (Sandbox Code Playgroud)
上述函数的实现能否区分以下两个调用,第一个是p1 = null隐式传递,第二个是显式传递?
f() // Implicit
f(null) // Explicit
f(p1 = null) // Explicit
Run Code Online (Sandbox Code Playgroud)
注意:可以有任意数量的参数
最后一个参数具有默认值是很实用的,如下所示。
function add(x, y = 5) {
return x + y;
}
console.log(add(3)); // results in '8'
Run Code Online (Sandbox Code Playgroud)
但是,除了最后一个参数之外,是否可以使用默认值?如果是这样,您将如何调用它以使用第一个默认值,但提供第二个参数?
function add(x = 5, y) {
return x + y;
}
console.log(add(,3)); // doesn't work
Run Code Online (Sandbox Code Playgroud) 我希望我的一些函数参数是可选的,所以我使用了默认参数,如下所示:
fun defaultparameter(param1: String = "", param2: String = "", param3: Int = 0)
Run Code Online (Sandbox Code Playgroud)
这项工作我可以做到这一点:
defaultparameter()
defaultparameter("titi")
defaultparameter("titi", "tata")
Run Code Online (Sandbox Code Playgroud)
我可以这样做,因为默认参数位于末尾,但是当我的参数位于中间时:defaultparameter("titi", 0)
这不起作用,它要求我提供param2.
我猜测编译器只能省略末尾的参数,但这正常吗?我知道当参数是相同类型时,编译器无法知道哪个是哪个,但这里我Int最后有一个类型,所以我认为它可以工作。
我的问题是:默认参数只在最后起作用?或者我错过了什么?有没有什么方法可以在不使用多态性和声明其他函数的情况下实现这一目标,只有两个参数:一String和一Int?
目前使用顺风并制作可重用的反应组件面临着这个问题,您可以将一些样式作为顺风类作为道具传递。实际的问题在于“pb-{number}”属性。我可以通过这种方式,并且会很好地工作。“border-{number}”属性也会发生这种情况,但不知何故它接受 border-2 和 border-4 (仅限这些)。
import './button.css'
export default function Button({
color = "orange",
inset = "pb-3", <--- this will work
border = "border-8",
className,
onClick,
link
, ...props}){
return (
<div onClick={onClick}
className={`btn-${color} ${border}
${className} ${inset}`}> <--- this will work
<div>
{props.children}
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试使其更清晰,那么不使用顺风的人只需传递一个值(如下例所示),它将无法工作。
import './button.css'
export default function Button({
color = "orange",
inset = "1", <--- this
border = "4",
className,
onClick,
link
, ...props}){
return (
<div onClick={onClick}
className={`btn-${color} border-${border}
${className} pb-${inset}`}> <--- this wont work …Run Code Online (Sandbox Code Playgroud) kotlin ×3
c++ ×2
javascript ×2
constructor ×1
ecmascript-6 ×1
inheritance ×1
overriding ×1
python ×1
python-3.x ×1
react-props ×1
reactjs ×1
swift ×1
swift3 ×1
tailwind-css ×1
templates ×1